1. ホーム
  2. データベース

[c3p0] Error: c3p0プールの初期化中... ComboPooledDataSource [ acquireIncrement...

2022-02-26 06:30:31

本の指示通りにc3p0を設定するも、うまくいかない

実行開始時

メッセージを表示します。c3p0プールを初期化しています... Com.mchange.v2.c3p0. ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.c2.c2.c2.c3p0. mchange.v2.c3p0.impl. DefaultConnectionTester, dataSourceName -> 1hgeby99n2wpirj7phm07|69847c5d, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass - > com.mchange.v2.c3p0.impl.Datacenter -> 1hgeby99n2wpirj7phm07|69847c5d. mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hgeby99n2wpirj7phm07|69847c5d, idleConnectionTestPeriod ->.NULL, IdleConnectionTestPeriod -> 

その後、十数回リフレッシュしたところ、以下のような例外が報告されました。

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: データソースが接続の確立を拒否しました。サーバーからのメッセージ : "Too many connections"

まず、データベース接続プールを構成するために使用したコードから説明します。

public static Connection getConnection() throws PropertyVetoException, SQLException{//c3p0 connection pool
		ComboPooledDataSource cpds = new ComboPooledDataSource();
		try {
			cpds.setDriverClass(DriverURL);
		} catch (PropertyVetoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		cpds.setJdbcUrl(ConURL);
		cpds.setUser(username);
		cpds.setPassword(passwoed);
		cpds.setMaxPoolSize(30);
		cpds.setMinPoolSize(2);
		cpds.setInitialPoolSize(10);
		cpds.setMaxStatements(180);
		return cpds.getConnection();
	}



例外ステートメント: "Too many connections"と組み合わせることで、エラーがここにあることが明らかになりました。
ComboPooledDataSource cpds = new ComboPooledDataSource();

getConnectionのたびに、ComboPooledDataSourceクラスを作成します。ComboPooledDataSourceは、作成にリソースがかかるヘビー級クラスで、もちろんエラーも報告されます

シングルトン・パターンを使ってComboPooledDataSourceクラスを作成すると、問題が解決されます。

private static ComboPooledDataSource ds;
	static{
		ds = new ComboPooledDataSource();
		try {
			ds.setDriverClass(DriverURL);
		} catch (PropertyVetoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ds.setJdbcUrl(ConURL);
		ds.setUser(username);
		ds.setPassword(passwoed);
		ds.setMaxPoolSize(30);
		ds.setMinPoolSize(2);
		ds.setInitialPoolSize(10);
		ds.setMaxStatements(180);
	}

HungryHanのスタイルを使っていて、getConnectionメソッドを

public static Connection getConnection() throws PropertyVetoException, SQLException{//with connection pool
		return ds.getConnection();
	}