如何在Hibernate SessionFactory创建新连接后立即运行SQL查询?

时间:2015-08-09 22:00:46

标签: java mysql hibernate c3p0 utf8mb4

我的服务器使用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;

1 个答案:

答案 0 :(得分: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