我的服务器使用Hibernate连接到MySQL数据库。我也使用c3p0进行连接池。我想在每个连接创建时执行一次特定的sql查询,但由于我使用ComboPooledDataSource
,因此无法检测何时创建新会话。
我发现我可以通过在结帐时启用测试连接来运行我的查询,并将我想要运行的查询设置为首选测试查询(但它可以运行多次)。
String query = "my query";
comboPooledDataSource.setTestConnectionOnCheckout(true);
comboPooledDataSource.setPreferredTestQuery(query);
有更优雅的方法来实现这个目标吗?
*编辑*
我试图让我的db接受utf8mb4字符。 可接受的方法是将以下内容应用于my.cnf文件:
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
问题在于我无法访问除我的数据库之外的任何内容,因此我的解决方案是为每个连接执行SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
。
答案 0 :(得分:2)
请参阅c3p0' ConnectionCustomizer界面。覆盖AbstractConnectionCustomizer的onAcquire(...)
方法。在每个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