01: /*
02: * Distributed as part of c3p0 v.0.9.1.2
03: *
04: * Copyright (C) 2005 Machinery For Change, Inc.
05: *
06: * Author: Steve Waldman <swaldman@mchange.com>
07: *
08: * This library is free software; you can redistribute it and/or modify
09: * 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: package com.mchange.v2.c3p0.stmt;
24:
25: import java.sql.*;
26: import com.mchange.v2.async.AsynchronousRunner;
27:
28: public final class DoubleMaxStatementCache extends GooGooStatementCache {
29: //MT: protected by this' lock
30: int max_statements;
31: Deathmarch globalDeathmarch = new Deathmarch();
32:
33: int max_statements_per_connection;
34: DeathmarchConnectionStatementManager dcsm;
35:
36: public DoubleMaxStatementCache(
37: AsynchronousRunner blockingTaskAsyncRunner,
38: int max_statements, int max_statements_per_connection) {
39: super (blockingTaskAsyncRunner);
40: this .max_statements = max_statements;
41: this .max_statements_per_connection = max_statements_per_connection;
42: }
43:
44: //called only in parent's constructor
45: protected ConnectionStatementManager createConnectionStatementManager() {
46: return (this .dcsm = new DeathmarchConnectionStatementManager());
47: }
48:
49: //called by parent only with this' lock
50: void addStatementToDeathmarches(Object pstmt,
51: Connection physicalConnection) {
52: globalDeathmarch.deathmarchStatement(pstmt);
53: dcsm.getDeathmarch(physicalConnection).deathmarchStatement(
54: pstmt);
55: }
56:
57: void removeStatementFromDeathmarches(Object pstmt,
58: Connection physicalConnection) {
59: globalDeathmarch.undeathmarchStatement(pstmt);
60: dcsm.getDeathmarch(physicalConnection).undeathmarchStatement(
61: pstmt);
62: }
63:
64: boolean prepareAssimilateNewStatement(Connection pcon) {
65: int cxn_stmt_count = dcsm.getNumStatementsForConnection(pcon);
66: if (cxn_stmt_count < max_statements_per_connection) //okay... we can cache another for the connection, but how 'bout globally?
67: {
68: int global_size = this .countCachedStatements();
69: return (global_size < max_statements || (global_size == max_statements && globalDeathmarch
70: .cullNext()));
71: } else
72: //we can only cache if we can clear one from the Connection (which implies clearing one globally, so we needn't check max_statements)
73: return (cxn_stmt_count == max_statements_per_connection && dcsm
74: .getDeathmarch(pcon).cullNext());
75: }
76: }
|