KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > mchange > v2 > c3p0 > stmt > DoubleMaxStatementCache


1 /*
2  * Distributed as part of c3p0 v.0.9.1
3  *
4  * Copyright (C) 2005 Machinery For Change, Inc.
5  *
6  * Author: Steve Waldman <swaldman@mchange.com>
7  *
8  * This library is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU Lesser General Public License version 2.1, as
10  * published by the Free Software Foundation.
11  *
12  * This software is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public License
18  * along with this software; see the file LICENSE. If not, write to the
19  * Free Software Foundation, Inc., 59 Temple Place, Suite 330,
20  * Boston, MA 02111-1307, USA.
21  */

22
23
24 package com.mchange.v2.c3p0.stmt;
25
26 import java.sql.*;
27 import com.mchange.v2.async.AsynchronousRunner;
28
29 public final class DoubleMaxStatementCache extends GooGooStatementCache
30 {
31     //MT: protected by this' lock
32
int max_statements;
33     Deathmarch globalDeathmarch = new Deathmarch();
34
35     int max_statements_per_connection;
36     DeathmarchConnectionStatementManager dcsm;
37
38     public DoubleMaxStatementCache(AsynchronousRunner blockingTaskAsyncRunner, int max_statements, int max_statements_per_connection)
39     {
40     super( blockingTaskAsyncRunner );
41     this.max_statements = max_statements;
42     this.max_statements_per_connection = max_statements_per_connection;
43     }
44
45     //called only in parent's constructor
46
protected ConnectionStatementManager createConnectionStatementManager()
47     { return (this.dcsm = new DeathmarchConnectionStatementManager()); }
48
49     //called by parent only with this' lock
50
void addStatementToDeathmarches( Object JavaDoc pstmt, Connection physicalConnection )
51     {
52     globalDeathmarch.deathmarchStatement( pstmt );
53     dcsm.getDeathmarch( physicalConnection ).deathmarchStatement( pstmt );
54     }
55
56     void removeStatementFromDeathmarches( Object JavaDoc pstmt, Connection physicalConnection )
57     {
58     globalDeathmarch.undeathmarchStatement( pstmt );
59     dcsm.getDeathmarch( physicalConnection ).undeathmarchStatement( pstmt );
60     }
61
62     boolean prepareAssimilateNewStatement(Connection pcon)
63     {
64     int cxn_stmt_count = dcsm.getNumStatementsForConnection( pcon );
65     if (cxn_stmt_count < max_statements_per_connection) //okay... we can cache another for the connection, but how 'bout globally?
66
{
67         int global_size = this.countCachedStatements();
68         return ( global_size < max_statements || (global_size == max_statements && globalDeathmarch.cullNext()) );
69         }
70     else //we can only cache if we can clear one from the Connection (which implies clearing one globally, so we needn't check max_statements)
71
return (cxn_stmt_count == max_statements_per_connection && dcsm.getDeathmarch( pcon ).cullNext());
72     }
73 }
74
Popular Tags