1

我的服务器使用 Hibernate 来连接到 MySQL 数据库。我还使用 c3p0 进行连接池。我想在创建时对每个连接执行一次特定的 sql 查询,但由于我使用ComboPooledDataSource的是 ,因此无法检测何时创建新会话。我发现我可以通过在结帐时启用测试连接来运行我的查询,并将我想要运行的查询设置为首选测试查询(但它可以运行多次)。

String query = "my query";
comboPooledDataSource.setTestConnectionOnCheckout(true);
comboPooledDataSource.setPreferredTestQuery(query);

有没有更优雅的方法来实现这一点?

* 编辑 *

我试图让我的数据库接受 utf8mb4 字符。可接受的方法是将以下内容应用于 my.cnf 文件:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

问题是除了我的数据库之外我无权访问任何东西,所以我的解决方案是SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;为每个连接执行。

4

1 回答 1

2

请参阅 c3p0 的ConnectionCustomizer接口。覆盖AbstractConnectionCustomizeronAcquire(...)的方法。在从数据库中获取它之后,在它可供客户端检出之前,每个 Connection 只调用一次。onAcquire(...)

或者,如果您愿意,您可以将 c3p0 的内置示例用于此类用例,com.mchange.v2.c3p0.example.InitSqlConnectionCustomizer

在 c3p0.properties 中:

c3p0.connectionCustomizerClassName=com.mchange.v2.c3p0.example.InitSqlConnectionCustomizer
c3p0.extensions.initSql=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
于 2015-08-10T08:46:33.147 回答