最近项目里用到了rmijdbc,使用过程中发现了两个问题
- jdbc-odbc读取备注类型(meno)字段,混合数字的长文本容易出现阶段的现象
- rmi客户端连接执行查询时,会开启大量端口。大部分端口都只用一次就放弃不用,操作系统就会将端口设置为“TIME_WAIT”的状态
rmijdbc读取Access是非常方便的,在access文件所在服务器上启动rmijdbc的服务,可以方便的为远程服务器提供访问数据的接口
我这边基本的用法如下:
- 在服务器端创建odbc数据源(此时选取驱动程序,并指向一个mdb文件)
此时需要注意一个问题,windows 本身不自带64位的驱动 - 启动rmijdbc服务器端
java org.objectweb.rmijdbc.RJJdbcServer
- 客户端调用rmi格式的连接字符串进行正常的数据库连接
Class.forName("org.objectweb.rmijdbc.Driver"); Connection c = DriverManager .getConnection("jdbc:rmi://172.16.192.42/jdbc:odbc:xwzx"); ...
更详细的见rmijdbc官网
方便归方便, 但是在强大的测试同学面前,还是发现了两个非常严重的坑
- 读取meno类型(备注类型)字段出现字符串截断问题
- 现象:对access表中meno类型的字段进行数据查询,通过jdbcodbc桥接的方式,数据读取会出现不定长度的截断。当然我们普通开发是在jdbcTemplate中调用queryForList方法。
- 分析:
- 先去网上查,发现可能是oledbjet驱动的问题,但是这种解决方案不正常,总不能老去改注册表。
并且在此时发现了一个更加深入的现象:meno字段中,如果全部都是汉字,那么不会截断,如果前256个字符中有数字,那么会截断 - 既然是驱动的问题,那我换驱动总可以吧,从32位的驱动换成64的,从odbcjet32换成aceodbc,修改数据源缓冲区。。。经历了各种尝试,发现问题依旧
- 还是上网找找吧,度娘不行了,还得谷神,经过各种阅读英文结果,最后终于在一个角落里找到了一篇文章,拜读一次以后,发现lz是以最基本的桥接方式链接数据源的(rmijdbc本质上也是这样的)。第一眼看上去感觉不靠谱,但聊胜于无,自己尝试了下,还真的发现了突破点,这样写竟然就不会发生截断(这是在逗我吗…)
ResultSet rs = st.executeQuery();
String data = new String(rs.getBytes(1), "gbk");
这本质上就是不利用驱动已经实现的类型判断方式,自己直接获取数据。说白了,就是驱动底层的数据类型封装方式有问题。和这个现象说的其实是异曲同工的,但是为啥网上前人遇到的此类问题很少?可能无非两种,第一,没人往这个方向想,第二,这个问题太简单了。
希望不会是第二种。。。
- 先去网上查,发现可能是oledbjet驱动的问题,但是这种解决方案不正常,总不能老去改注册表。
- rmi客户端连接时占用大量端口