RMIJdbc使用中的问题

最近项目里用到了rmijdbc,使用过程中发现了两个问题

  1. jdbc-odbc读取备注类型(meno)字段,混合数字的长文本容易出现阶段的现象
  2. rmi客户端连接执行查询时,会开启大量端口。大部分端口都只用一次就放弃不用,操作系统就会将端口设置为“TIME_WAIT”的状态

rmijdbc读取Access是非常方便的,在access文件所在服务器上启动rmijdbc的服务,可以方便的为远程服务器提供访问数据的接口
我这边基本的用法如下:

  1. 在服务器端创建odbc数据源(此时选取驱动程序,并指向一个mdb文件)
    此时需要注意一个问题,windows 本身不自带64位的驱动
  2. 启动rmijdbc服务器端
    java org.objectweb.rmijdbc.RJJdbcServer
  3. 客户端调用rmi格式的连接字符串进行正常的数据库连接
    Class.forName("org.objectweb.rmijdbc.Driver");
    Connection c = DriverManager
    .getConnection("jdbc:rmi://172.16.192.42/jdbc:odbc:xwzx");
    ...

更详细的见rmijdbc官网
方便归方便, 但是在强大的测试同学面前,还是发现了两个非常严重的坑

  1. 读取meno类型(备注类型)字段出现字符串截断问题
    • 现象:对access表中meno类型的字段进行数据查询,通过jdbcodbc桥接的方式,数据读取会出现不定长度的截断。当然我们普通开发是在jdbcTemplate中调用queryForList方法。
    • 分析:
      1. 先去网上查,发现可能是oledbjet驱动的问题,但是这种解决方案不正常,总不能老去改注册表。
        并且在此时发现了一个更加深入的现象:meno字段中,如果全部都是汉字,那么不会截断,如果前256个字符中有数字,那么会截断
      2. 既然是驱动的问题,那我换驱动总可以吧,从32位的驱动换成64的,从odbcjet32换成aceodbc,修改数据源缓冲区。。。经历了各种尝试,发现问题依旧
      3. 还是上网找找吧,度娘不行了,还得谷神,经过各种阅读英文结果,最后终于在一个角落里找到了一篇文章,拜读一次以后,发现lz是以最基本的桥接方式链接数据源的(rmijdbc本质上也是这样的)。第一眼看上去感觉不靠谱,但聊胜于无,自己尝试了下,还真的发现了突破点,这样写竟然就不会发生截断(这是在逗我吗…)
        ResultSet rs = st.executeQuery();
        String data = new String(rs.getBytes(1), "gbk");

        这本质上就是不利用驱动已经实现的类型判断方式,自己直接获取数据。说白了,就是驱动底层的数据类型封装方式有问题。和这个现象说的其实是异曲同工的,但是为啥网上前人遇到的此类问题很少?可能无非两种,第一,没人往这个方向想,第二,这个问题太简单了。
        希望不会是第二种。。。
  2. rmi客户端连接时占用大量端口rmi_pronlems2

发表评论

邮箱地址不会被公开。 必填项已用*标注