Jetty项目中Oracle JDBC连接创建时执行初始化SQL的方法
在Jetty中给Oracle JDBC连接添加会话初始化SQL的方案
Oracle JDBC的OracleDataSource并没有内置run-sql-on-connect这类直接执行初始化SQL的属性,但有两种靠谱的方式实现你要的「每次建立连接时修改会话」的需求:
方法一:用Oracle JDBC的初始化回调(应用端实现)
你可以通过自定义InitializationCallback接口的实现类,在连接建立后自动执行指定SQL,然后把这个回调注册到数据源里。
Jetty XML配置示例
<New id="OracleDS_local" class="org.mortbay.jetty.plus.naming.Resource"> <Arg>jdbc/local</Arg> <Arg> <New class="oracle.jdbc.pool.OracleDataSource"> <Set name="URL">jdbc:oracle:thin:*******</Set> <Set name="user">*****</Set> <Set name="password">****</Set> <!-- 注册自定义初始化回调 --> <Call name="setConnectionInitializationCallback"> <Arg> <New class="com.yourteam.SessionInitializer"/> </Arg> </Call> </New> </Arg> </New>
对应的Java回调类
package com.yourteam; import oracle.jdbc.InitializationCallback; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; public class SessionInitializer implements InitializationCallback { @Override public void initialize(Connection conn) throws SQLException { // 这里写你要执行的会话修改SQL try (Statement stmt = conn.createStatement()) { stmt.execute("ALTER SESSION SET TIME_ZONE='Asia/Shanghai'"); } } }
把这个类打包到你的项目中,Jetty启动时就会自动在每个新连接建立后执行这段SQL。
方法二:数据库端登录触发器(无需修改应用)
如果不想改动应用代码,可以在Oracle数据库中给你的业务用户创建一个登录触发器,每次用户连接时自动执行会话配置:
CREATE OR REPLACE TRIGGER USER_SESSION_INIT AFTER LOGON ON YOUR_APP_USER.SCHEMA BEGIN -- 替换成你的会话修改语句 EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_DATE_FORMAT=''YYYY-MM-DD HH24:MI:SS'''; END; /
这种方式对应用完全透明,所有通过该用户建立的连接都会自动应用会话配置。
关于你尝试的connectionProperties配置
Oracle的connectionProperties只支持驱动内置的标准属性(比如defaultNChar=true、fetchSize=50这类),并不存在run-sql-on-connect这个属性,所以你原来的配置不会生效。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

