ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

WebLogic连接瀚高数据库:驱动配置、数据源创建与连接池调优

WebLogic连接瀚高数据库:驱动配置、数据源创建与连接池调优 最近接了个信创改造项目应用服务器是WebLogic 12c数据库要从某商业数据库换成瀚高数据库HighGo Database。客户一开始觉得很简单“不就是改个数据源嘛。”结果真动手才发现从驱动部署、数据源创建到连接池调优每一步都藏着以前用商业数据库时根本不会碰到的坑。尤其是驱动类名、默认端口、测试表名这种细节错一个就连接不上而且报错信息还不直观。这篇文章不是从官方文档抄来的步骤清单而是我把整个WebLogic连接瀚高数据库的链路完整跑通后把配置过程、踩坑经历、排查思路和调优建议全部梳理了一遍。如果你是做国产化适配、信创迁移或者手头正好有“WebLogic 瀚高数据库”这个组合要处理这篇文章可以直接当作操作手册来用能帮你少走不少弯路。1. 先搞清楚要在哪个环境里解决“连接”这件事1.1 这个组合最常见的使用场景与前置条件WebLogic连瀚高数据库绝大多数出现在两种场景一是存量系统做国产化替代业务代码和中间件不能大改只能换底层数据库二是新项目信创验收要求应用服务器、数据库、操作系统全链路国产化兼容。这两种场景下WebLogic往往是产品选型里已经锁定的一环数据库换成瀚高后出问题的概率反而集中在你原本认为最熟悉的“配数据源”这一步上。动手之前先列一份环境清单避免排查问题时分不清是哪个环节出错应用服务器版本WebLogic 11g、12c、14c都可能遇到本文以12c为主14c操作路径基本一致。瀚高数据库版本需确认是V4、V5还是当前官网在发的新版本不同版本驱动类名和URL有差异。JDK版本WebLogic 12c默认支持Java 7/8如果瀚高驱动用了Java 11编译直接ClassNotFoundException后面细说。数据库部署方式单机、主备、集群影响连接URL是否要写多个地址。网络连通性WebLogic所在服务器能否ping通瀚高数据库服务器端口是否放通。1.2 连接的本质JDBC、JNDI和数据库协议三者缺一不可很多人在这一步犯迷糊是因为把“配置数据源”理解成了“填个连接字符串”。实际上WebLogic连接瀚高数据库背后是三层结构第一层是数据库本身瀚高数据库基于PostgreSQL内核兼容PostgreSQL客户端协议这意味着它可以被任何支持PostgreSQL协议的JDBC驱动访问也可以用瀚高官方定制驱动。第二层是JDBC驱动驱动负责把JDBC API调用转换成瀚高数据库能识别的网络协议。这里有两条路直接用瀚高官方驱动或者用PostgreSQL社区驱动。两条路都通但细节差异很多这是整篇文章最关键的分叉口。第三层是JNDI数据源WebLogic内部把数据库连接池包装成JNDI数据源应用代码通过java:comp/env/jdbc/xxx查找DataSource拿到连接后执行SQL。配置数据源的本质就是把“驱动类名 JDBC URL 用户名密码 连接池参数”打包成一个JNDI对象注册到WebLogic的命名服务里。明白这个链路后后面出任何报错都可以先定位是驱动层、URL层、权限层还是JNDI层的问题排查效率完全不同。2. 驱动选型是第一道分水岭瀚高官方驱动和PG兼容驱动怎么选2.1 瀚高JDBC驱动与PostgreSQL兼容驱动的真实关系瀚高数据库因为是PostgreSQL内核所以JDBC驱动天然有两个选择。第一个选择是瀚高官方提供的JDBC驱动一般在安装目录或官网下载中心可以拿到文件名类似highgo*.jar。这个驱动在PostgreSQL原生驱动基础上做了定制有些版本会打包一些瀚高高可用、全局临时表之类的扩展特性。驱动类名通常是com.highgo.jdbc.DriverURL前缀是jdbc:highgo://。第二个选择是直接用PostgreSQL官方JDBC驱动postgresql-42.x.x.jar类名org.postgresql.DriverURL前缀jdbc:postgresql://。你可能会觉得“既然兼容那就随便用一个”这里恰恰是最容易踩坑的地方。我用一个类比解释瀚高数据库是“基于PostgreSQL内核”的国产数据库但它在服务端可能有自己的参数逻辑、认证方式、扩展函数。官方驱动像是“瀚高内部员工”知道哪些参数要用哪种姿势传哪些认证方式默认开PostgreSQL驱动像是“外来的兼容者”90%的功能没问题但遇到瀚高特有的设置就可能闹脾气。在实际项目中我的建议是优先用瀚高官方驱动因为你遇到问题打售后电话对方第一句话大概率是“您用的是不是我们官方驱动”。如果站点比较多、环境复杂也可以用PostgreSQL驱动兜底但要做好测试特别是XA事务、批量插入、特殊字符集这几个场景。2.2 驱动类名、JDBC URL和默认端口这三个参数必须一次性填对我在配置数据源时第一道坎就是这三个基础参数。很多人栽就栽在“想当然”上比如习惯性地写5432端口那是PostgreSQL默认端口结果瀚高数据库默认端口是5866连半天连不上还以为是防火墙问题。这里根据不同驱动给出两套可用的参数组合项目瀚高官方驱动PostgreSQL兼容驱动驱动类名com.highgo.jdbc.Driverorg.postgresql.DriverJDBC URLjdbc:highgo://127.0.0.1:5866/dbnamejdbc:postgresql://127.0.0.1:5866/dbname默认端口5866视版本可能不同5866连接瀚高时适用场景生产环境推荐兜底、或者已有PG工具链特别提醒一句如果你拿到的是新版瀚高驱动最好先确认驱动包里的实际类名和URL前缀别被旧文档误导。最快的确认方式是把jar包解压看META-INF/services/java.sql.Driver文件里写的是哪个类或者直接unzip -p highgo.jar META-INF/MANIFEST.MF查看。我在命令行里经常这样验证驱动类是否存在jar tf highgojdbc.jar | grep -i driver这个方法虽然笨但比上网搜索各种“最新版驱动类名”靠谱得多。2.3 驱动jar包部署到WebLogic的正确位置与生效条件把驱动jar下载下来后放哪里是个讲究。我见过不少运维同学直接把jar扔到JDK的lib/ext目录下或者丢到WebLogic安装目录里的server/lib当时能连通就以为搞定结果一重启又报ClassNotFoundException原因就是放错了位置。WebLogic加载驱动类有三个常见位置按优先级和建议如下域名库目录$DOMAIN_HOME/lib/。这是我最推荐的位置。WebLogic启动时会自动把这个目录加入CLASSPATH而且只影响当前域不会污染其他域。所有Server的启动脚本CLASSPATH需要手动修改setDomainEnv.sh把jar路径追加进去适合特殊目录要求。应用自身的WEB-INF/lib只对单个应用生效不推荐因为JNDI数据源是WebLogic容器层面的资源驱动最好放在容器层。这里要注意一个生效条件放到$DOMAIN_HOME/lib后必须重启对应的Server进程尤其是AdminServer。有些人在WebLogic控制台里“部署”了一个jar包就以为加载了其实控制台的“部署”功能是面向应用的不是面向驱动库的。驱动jar放进lib目录后重启才是唯一生效方式不存在热加载。2.4 版本兼容性JDK、WebLogic和驱动三者的匹配关系这个坑比较隐蔽但一旦遇到非常耗时间。WebLogic 12c如果跑在JDK 8上而瀚高新版驱动是JDK 11编译的就会启动即报类似java.lang.UnsupportedClassVersionError。反过来如果WebLogic用的是较新JDK而驱动是老版本也可能出现TLS协议不匹配导致连接失败。我的经验是先确认WebLogic实际使用的JDK版本再确认瀚高驱动包编译版本最后确认WebLogic版本和数据库版本的兼容性。瀚高官网或售后渠道一般都有兼容性清单如果内部没有明确说明可以按“WebLogic 12c JDK 8 瀚高V4/V5较新驱动”这个组合去测基本能覆盖大多数线上环境。如果你有多个WebLogic域不同域用不同JDK那每个域都要单独验证一遍不能只测一个就复制到所有环境。3. 数据源配置全流程从控制台操作到JNDI真正可用3.1 控制台新建数据源必须注意的几个界面细节WebLogic管理控制台的登录入口一般是http://服务器IP:7001/console。进入后按这个路径操作“服务” - “数据源” - “新建”。新建数据源时WebLogic会让你选择“数据库类型”和“驱动程序”。问题来了下拉框里大概率没有“HighGo”这个选项只有Oracle、MySQL、SQL Server这些主流类型。很多人在这里就卡住了不知道该选哪个。技巧是选择“其他”或“Generic”类型然后在“数据库驱动程序”里选择“其他数据库”系统会允许你手动填写驱动类名和JDBC URL。这一步不要图省事去选“Oracle”否则WebLogic会尝试按Oracle方式解析参数后面出现一些莫名其妙的报错。具体的参数填写参考名称highgoDS自定义JNDI名称jdbc/highgoDS应用代码里找的名字数据库驱动程序com.highgo.jdbc.Driver或org.postgresql.Driver属性配置方式我建议直接用URL方式在“数据库URL”里写完整地址避免在“属性”框里拼错格式数据库URLjdbc:highgo://127.0.0.1:5866/testdb用户名highgo密码数据库用户密码有时候新建向导会让你填写“数据库名称”和“主机名”这些独立字段。如果同时要求填URL记住独立的数据库名称、主机名、端口字段可以随便填或跳过最终生效的还是URL里的信息。这是一个从WebLogic 11g就存在的“坑”很多人改了界面上的“主机名”却忘了改URL导致连接到的还是旧库。3.2 “目标”分配数据源创建后漏掉这一步等于白配数据源配置完成后控制台会提示你“是否分配目标”。这一步是新手最容易忽略的。如果数据源没有分配到目标Server比如AdminServer或你的ManagedServerJNDI名称不会持有服务应用根本拿不到数据源。我见过不止一次管理员在控制台创建了数据源测试连接也显示成功但应用启动时报NameNotFoundException排查到最后才发现数据源没有“目标”。在WebLogic里分配目标相当于把数据源“挂载”到服务器上这是一个独立动作和创建数据源是两件事。操作位置进入数据源详情页切换到“目标”选项卡勾选你要部署的Server实例点击保存。如果数据源不需要给所有Server用只勾对应的即可。分配完成后数据源状态会显示为“已运行”之后应用才能正常通过JNDI查找。3.3 WLST脚本方式批量环境中比手工点控制台更可靠的方式如果你只需要配一两套环境控制台手点没问题。但如果要一次部署开发、测试、预生产多套环境或者需要把数据源配置代码化交给运维平台执行那就应该用WLST脚本WebLogic Scripting Tool。WLST是WebLogic自带的Python脚本工具可以离线或在线执行配置操作。下面是一个简化的WLST配置数据源的示例思路比完整的生产脚本简单但关键步骤都在# 连接AdminServer connect(weblogic,password,t3://127.0.0.1:7001) edit() startEdit() # 新建JDBC系统资源 ds create(highgoDS, JDBCSystemResource) ds.setTargets(AdminServer) # 配置JDBC驱动参数 params ds.getJDBCResource().getJDBCDriverParams() params.setDriverName(com.highgo.jdbc.Driver) params.setUrl(jdbc:highgo://127.0.0.1:5866/testdb) params.setPassword(db_password) # 配置数据源属性 props params.getProperties() user_prop props.createProperty(user) user_prop.setValue(highgo) # 保存并激活 save() activate() exit()用WLST的好处是每次执行的动作可重复出了偏差可以直接改脚本重跑还方便做版本管理。如果项目里有配置自动化平台这个脚本可以直接嵌入流水线比人工点控制台省心太多。3.4 连接测试的正确姿势控制台“测试连接”成功只代表第一步WebLogic控制台的数据源页面有个“测试连接”按钮点击后能验证WebLogic能否用当前的URL、用户名、密码连上数据库。这个测试能过说明前三层没问题驱动能加载、URL能解析、用户名密码正确。但注意控制台测试成功并不等于应用可以正常使用。因为应用拿到的是JNDI数据源里的连接池连接连接池可能会因为配置问题在真正运行时才暴露错误。所以我建议做了两层验证第一层控制台测试连接确认数据库可达。 第二层写一个最简的JSP或Servlet在应用里通过JNDI查找数据源并执行一条SELECT version()语句确认应用环境里真的能拿到连接、能执行SQL。一个简单的测试JSP示例% page importjavax.naming.*, javax.sql.*, java.sql.* % % Context ctx new InitialContext(); DataSource ds (DataSource) ctx.lookup(java:comp/env/jdbc/highgoDS); Connection conn ds.getConnection(); Statement stmt conn.createStatement(); ResultSet rs stmt.executeQuery(SELECT version()); while (rs.next()) { out.println(rs.getString(1)); } conn.close(); %如果这段代码能正常输出瀚高的版本信息那这条链路才算真正打通。4. 实战踩坑记录连接过程中的典型报错和完整排查链路4.1 ClassNotFoundException驱动jar到底放哪里才算数报错现象WebLogic启动后首次访问数据源时报java.lang.ClassNotFoundException: com.highgo.jdbc.Driver但jar包明明已经放在某个目录里了。排查链路我遇到这类问题从不急着看代码先确认WebLogic到底从哪里加载驱动类。“jar放在哪个目录”这件事的优先级非常高。一步步来先确认jar是否在$DOMAIN_HOME/lib下注意不是$WL_HOME/server/lib。这两个目录看着像但前者是域级后者是WebLogic安装级。放后者的坑在于多个域共享升级WebLogic可能被覆盖。确认没有同时放在JDK的lib/ext目录造成版本冲突。如果你之前已经扔进去过旧版本驱动新版本不会覆盖类加载器可能加载旧类。重启AdminServer和ManagedServer后在控制台“环境”-“服务器”-对应Server的“类路径”里看驱动jar是否出现在启动CLASSPATH中。如果确认在但仍报ClassNotFoundException查看是不是CLASSPATH里存在同名的不同版本jar用find / -name *highgo*.jar全盘排查一遍。根因总结绝大多数情况就是驱动jar没放在WebLogic真正读取的目录或者放入了但没重启。直接按上面步骤走一遍基本10分钟定位。4.2 连接超时瀚高数据库默认端口5866不是5432报错现象控制台测试连接时长时间转圈然后提示Connection timed out应用日志里也会有Cannot connect to database之类的错误。排查链路连接超时是最好定位但又最容易犯的问题。先看配置的JDBC URL里端口是多少。如果你潜意识里写了5432请停一下。瀚高数据库默认端口是5866不是PostgreSQL的5432。虽然瀚高兼容PostgreSQL但端口不一定变。用telnet直接测试端口连通性telnet 127.0.0.1 5866能通就是数据库端口没问题。如果不能通分两种情况一是WebLogic服务器到数据库服务器的网络不通可能是防火墙没放行端口二是数据库本身监听的不是默认端口需要查看瀚高数据库的postgresql.conf和pg_hba.conf确认实际端口。经验之谈我在一个项目里遇到半天连不上最后排查发现数据库运维在安装时改了端口为54321而开发文档里写的是5866。配置这类东西永远以数据库服务器的实际配置为准不要以默认值或文档为准。4.3 认证失败数据库端的pg_hba.conf不是摆设报错现象URL和端口都对用户名密码也对但连接时报类似FATAL: password authentication failed for user highgo或者no pg_hba.conf entry for host 10.10.x.x。排查链路如果是密码错误那很好办去数据库端改密码或确认密码字符串是否有隐藏空格。但更隐蔽的是no pg_hba.conf entry这个报错它说的是“这个客户端的IP地址没有被数据库的访问控制规则放行”。瀚高数据库沿用PostgreSQL的访问认证体系文件是pg_hba.conf。里面逐行标明允许哪个IP段、用什么认证方式md5、scram-sha-256、trust等访问哪个数据库。排查时在数据库服务器上执行SHOW hba_file;确认当前生效的hba文件路径。编辑pg_hba.conf增加对应WebLogic服务器IP的放行规则例如host testdb highgo 10.10.8.0/24 scram-sha-256保存后不需要重启数据库重载配置即可SELECT pg_reload_conf();。再次测试连接。这个坑在单机测试时不会出现因为localhost默认放行换成跨服务器连接时才暴露。如果项目里多个环境建议把pg_hba.conf的配置也纳入版本管理避免每套环境手改。4.4 XA分布式事务能不用就不用要用先搞清楚版本支持报错现象配置XA数据源后WebLogic报Cannot enable distributed transaction或者应用在跨库事务时报XA协议错误。排查链路如果你确实需要XA即同一事务操作多个数据库资源那必须确认几点瀚高数据库当前版本是否支持XA事务。支持的话需要在数据库侧安装或启用对应的XA组件通常由数据库管理员执行。WebLogic里的XA数据源驱动类不能随便指定。com.highgo.jdbc.Driver如果内部不实现XADataSource接口或者实现不完整那配上XA数据源一定会失败。正确做法到瀚高官方驱动包里找到XA驱动类类名一般是com.highgo.xa.jdbc.XADataSource之类不同版本可能有差异。如果驱动包里没有这个类说明该版本不带XA支持。经验之谈我在实际项目中的原则是——能不碰XA就不碰XA。国产数据库的XA成熟度参差不齐WebLogic的分布式事务管理器又比较敏感两者搭配很容易出现“开发环境跑通生产环境偶发挂掉”的情况。如果业务可以在应用层通过消息、定时对账等方式解决多库一致性问题优先把XA方案拿掉。如果确实要XA先在测试环境跑压测确认在并发下稳定再上生产。4.5 中文乱码和应用层时区问题报错现象数据能查到但中文显示为???或者应用拿到的日期时间比数据库里少8小时。排查链路这两个问题通常不在数据源本身而在于JDBC连接参数和数据库字符集、时区的匹配。先确认瀚高数据库的字符集执行SHOW server_encoding;预期是UTF8。确认连接URL里是否带了编码参数比如jdbc:highgo://127.0.0.1:5866/testdb?useUnicodetruecharacterEncodingUTF-8确认JVM启动默认字符集不是GBK这个可以在WebLogic的启动脚本里加-Dfile.encodingUTF-8。时区问题同样是加参数常见做法是在URL里加TimeZoneAsia/Shanghai或者在数据库端统一设置timezone。映射到瀚高上尽量做到数据库时区、JVM时区、操作系统时区三者一致否则应用取到的时间会出现偏移排查起来非常费劲。5. 连接池参数调优与应用侧长期运行建议5.1 核心连接池参数初始容量、最大容量和容量增量怎么定当数据源连通、业务跑起来之后别忘了回来看连接池参数。WebLogic默认的连接池设置偏保守并发稍高就会出现“连接等待超时”的报错但这不代表数据库扛不住而是连接池不够用。我建议重点关注四个参数初始容量建议设5~10。设太小刚启动时并发一上来会频繁创建连接设太大应用启动时间会变长也白占数据库连接数。最大容量根据业务并发估算。一般取“同时在线用户数 × 5%”或“压测时的最大并发连接数”。设到一两百不代表马上建那么多连接是给峰值留余地。容量增量每次扩充连接数的步长建议10~20。无连接等待时间连接池耗尽后新请求等待空闲连接的最大秒数。WebLogic里对应“无连接等待时间”建议不低于10秒避免瞬间把异常抛给业务。这些参数在数据源配置的“连接池”页签里修改改完不需要重启系统控制台保存后新参数会在下次获取连接时逐步生效但严谨起见还是在低峰期重启验证一下。5.2 测试表名是隐性地雷从SQL SELECT 1 FROM DUAL说起WebLogic数据源里有一个参数叫“测试表名”Test Table Name用来在每次获取连接前执行一条轻量查询确认该连接还没失效。WebLogic默认值通常是SQL SELECT 1 FROM DUAL这是为商业数据库准备的。问题来了瀚高数据库如果是PostgreSQL兼容模式不支持DUAL表。如果你忘了改这个参数连接池里的连接每次测试都会报错应用频繁冒出“Cannot get connection”之类的异常。正确写法是改成SQL SELECT 1。如果WebLogic版本比较老也可以配成SQL SELECT version()但SELECT 1是开销最小的。这个小字段非常隐蔽因为它不影响你第一次测试连接只在连接池运行一段时间、连接被回收重用时才出问题。我在项目上线第三天碰到这类故障排查到测试表名时自己都愣了一下——一个小配置差点引发生产事故。5.3 应用代码中获取数据源的标准写法最后补充一段应用侧的代码写法。数据源配置好之后Java代码里获取连接的标准方式是Context ctx new InitialContext(); DataSource ds (DataSource) ctx.lookup(jdbc/highgoDS); try (Connection conn ds.getConnection()) { // 正常执行SQL }这里有两个建议一是JNDI名称中尽量带jdbc/前缀符合Java EE规范团队里其他人接手时也容易识别二是不管用什么框架MyBatis、Hibernate还是裸JDBC最终都走这个DataSource不要在应用里自己拼URL再写一套连接管理否则连接池就白配了。如果在Spring环境里可以在Spring配置中注入这个JNDI数据源bean iddataSource classorg.springframework.jndi.JndiObjectFactoryBean property namejndiName valuejava:comp/env/jdbc/highgoDS/ /bean这样既能把连接管理收敛到WebLogic容器层也方便后续切换数据库时只改中间件配置应用代码一行都不用动。这也是信创项目里最推荐的做法之一。6. 最后分享一个排查连接问题的极简思路WebLogic连瀚高数据库整个链路就那么几层驱动类加载、URL解析、网络连通、认证鉴权、连接池管理。报错再多按“类找不到 - 连不上 - 认证失败 - 连接池异常”这条线走逐层排查大概率能在半小时内定位。我自己实际操作中最深的体会是这个组合的坑不在技术难度而在“信息不对称”。WebLogic是成熟商业中间件瀚高是国产数据库新势力两者的默认参数、文档习惯、报错风格完全不同。官网上各查各的文档很难对得上。所以写这篇文章时我刻意把这些容易对不上号的细节全部列了出来从端口、驱动类名到测试表名每一条都是实际踩过的。最后再补一个我最常用的小技巧在任何环境下手前先在这个数据库服务器的同一网段内用命令行工具把连接基本参数验证一遍。比如用psql -h 127.0.0.1 -p 5866 -U highgo -d testdb能连上说明数据库没问题然后再回WebLogic侧排查。如果命令行本身就报错那后面一切配置都不用急着做先把数据库侧的坑填平再说。这种“从下往上验证”的顺序能帮你避免在配置界面里反复试错把宝贵的排查时间省下来。
返回列表