Oracle JDBC驱动需手动放入domain/lib目录并重启domain,URL格式为jdbc:oracle:thin:@//host:port/service_name,Resource Type选javax.sql.DataSource,JNDI名须以java:app/等标准前缀开头。
确认 Oracle JDBC 驱动已正确部署到 domain/lib
glassfish 不会自动加载 ojdbc8.jar(或 ojdbc11.jar),必须手动放入 domain 的 lib/ 目录,否则创建数据源时会报 classnotfoundexception: oracle.jdbc.driver.oracledriver 或连接测试失败。
- 路径示例:
$GLASSFISH_HOME/glassfish/domains/domain1/lib/ - 不要放在
glassfish/lib/(全局 lib)——除非你有跨 domain 复用需求,否则易引发版本冲突 - 放入后必须重启 domain(
asadmin restart-domain),仅刷新管理控制台无效 - 验证方式:登录 Admin Console → “Server” → “Java” → “JVM Settings” → “JVM Options”,确认无重复 -Xbootclasspath 指向旧驱动
在 Admin Console 中配置 JDBC Connection Pool 时的关键参数
Oracle 数据源依赖 Connection Pool 配置,而非直接建 JDBC Resource。关键参数不匹配会导致连接超时、字符集乱码或 ORA-00604/ORA-12505 等错误。
-
Resource Type必须选javax.sql.DataSource(不是 XADataSource,除非你明确需要分布式事务) -
Database Vendor选Oracle—— 这会自动填充部分属性,但不能替代手动校验 -
URL格式必须为:jdbc:oracle:thin:@//host:port/service_name(注意双斜杠和 service_name,不用 SID;若用 SID,请改用@host:port:SID格式) -
User和Password填写数据库账号,该账号需有CREATE SESSION权限 - 务必添加自定义属性:
connectionProperties=oracle.jdbc.J2EE13Compliant=true(避免 JTA 场景下连接被意外关闭)
测试连接失败的三个高频原因及对应检查点
点击 “Ping” 显示“Ping Succeeded”才算真正可用。常见失败不是配置错,而是环境链路未通。
- 防火墙或网络策略阻断了 GlassFish 服务器到 Oracle DB 的
port(默认 1521)——用telnet db-host 1521在 GlassFish 所在机器上直连验证 - Oracle listener 未注册 service_name:在 DB 侧执行
lsnrctl status,确认输出中包含你的service_name,而非只有 SID - 连接池的
Validation Table Name留空或填了不存在的表(如DUAL是合法的,但某些 Oracle 版本要求显式授权查询权限给连接用户)
绑定 JDBC Resource 到应用时要注意 JNDI 名规范
Connection Pool 创建成功后,还需新建 JDBC Resource 并绑定 JNDI 名,这个名称会出现在代码里,命名不合规会导致 NamingException。
- JNDI 名必须以
java:global/、java:app/或java:module/开头(推荐java:app/jdbc/MyOracleDS) - 不要用
jdbc/MyDS这种裸名——GlassFish 7+ 默认禁用非标准前缀查找 - 在应用代码中通过
@Resource(lookup = "java:app/jdbc/MyOracleDS")注入,或 JNDI lookup 时传入完整名 - 如果应用是 WAR,且希望资源只对该 WAR 可见,JNDI 名用
java:module/更安全
ojdbc8.jar 要求 JDK 8+ 且不支持 oracle.jdbc.OracleDriver(已废弃),只认 oracle.jdbc.driver.OracleDriver 或更推荐的 oracle.jdbc.OracleDriver(新类名)。别跳过驱动包内的 META-INF/MANIFEST.MF 查看其声明的主类。


















