PostgreSQL jdbc driver的一个不完善之处
来源:互联网 发布:群晖网络唤醒端口 编辑:程序博客网 时间:2024/05/17 01:25
公司一个产品在上线到云以后,运行一段时间就会提示获取数据库连接失败,用 select * from pg_stat_activity; 查看所有连接,发现有很多连接最后一次执行的SQL语句是 SELECT t.typname,t.oid FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON (t.typspace = n.oid) WHERE n.nspname != 'pg_toast',经确认在程序中没有任何一处执行了该SQL。
我把 SELECT t.typname,t.oid FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON (t.typspace = n.oid) WHERE n.nspname != 'pg_toast' 这段SQL在postgresql中执行,发现报错,不能通过。
后来经过仔细排查,原来是PostgreSQL的jdbc驱动里的一个不完善之处。
在PostgreSQL jdbc驱动的源码里,有一个PgDatabaseMetaData.java,在里边有一个getTypeInfo()方法调用了类似的SQL,PgDatabaseMetaData.java中的SQL定义如下:
String sql; sql = "SELECT t.typname,t.oid FROM pg_catalog.pg_type t" + " JOIN pg_catalog.pg_namespace n ON (t.typnamespace = n.oid) " + " WHERE n.nspname != 'pg_toast'"; Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery(sql);
该段SQL语句在我的postgresql中是可以执行的,返回的是所有类型和表名。
经过仔细比对,两个SQL有细微差别,我的环境里未关闭的连接执行的SQL中是ON (t.typspace = n.oid),而jdbc驱动中执行的是ON (t.typnamespace = n.oid),是字段名称不一样!
我用的jdbc驱动的版本是9.4.1212,而上述源码的版本是42.1.1,估计是新版本的驱动是针对较新版本的postgresql设计的,而新版本的数据库中pg_type表将原typespace字段改名为typenamespace,导致了SQL语句执行失败。
而getTypeInfo()方法中并没有在finally{}语句块中关闭statement,也许这个错误会导致后续的一些错误。
更新PostgreSQL的jdbc驱动到最新版本,连接泄露的问题没有再出现。
- PostgreSQL jdbc driver的一个不完善之处
- 一个尚不完善的printf
- Cannot load JDBC driver class 'com.mysql.jdbc.Driver ' —— 一个坑爹的BUG
- JDBC-Driver、PostgreSQL的SQL语句参数上限错误分析及解决办法(源码)
- jdbc driver 的作用
- sqlserver的jdbc driver
- PostgreSQL的JDBC访问
- 一个不完善的可自定义弹出窗体的下拉框
- HBase SI,一个不完善的HBase 分布式事务的解决方案
- 一个实现智能指针的例子《还不完善》
- JDBC连接之PostgreSQL数据库
- Postgresql之于Jdbc的大对象操作
- 链表初识之功能不完善的链表
- C#之旅 艰难的a+b(不完善版本)
- sybase jdbc driver 的小毛病
- JDBC Driver 的系统要求
- 安装 mysql 的 JDBC driver
- System.Diagnostics.Process.Start("explorer.exe", path) 不完善之处
- 指针与引用的区别
- ubuntu16.0.4配置java环境
- 深入理解js面向对象——创建对象
- linux中vim的一些常用命令
- ubuntu 17.04安装为知笔记
- PostgreSQL jdbc driver的一个不完善之处
- 6月大咖新书:人工智能领衔推荐
- linux java进程后台启动,并输出日志到指定文件中
- 页面window.onload保持原来的位置定位
- hdu 1671
- Qt 出现“undefined reference to `vtable for”原因总结
- F1V3.0-图形-自动成图-站内图成图过程
- sql,将一张表数据插入另外一张表
- Spring+Mybatis+SpringMVC+Maven+MySql搭建实例