java - 无法使用 memcached 正确检索列名

标签 java mysql scala memcached

我有一个scala代码来使用memcached缓存MYSQL数据。下面是代码。

import java.sql.DriverManager
import scala.collection.mutable.ArrayBuffer
import java.sql.ResultSet
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import net.spy.memcached.MemcachedClient
import net.spy.memcached.AddrUtil
import net.spy.memcached.BinaryConnectionFactory
import com.sun.rowset.CachedRowSetImpl
import java.util.concurrent.TimeoutException
import java.util.concurrent.TimeUnit

object Memcachedtest 
{
  def MD5encode(query_line:String):String=
    {
        var md5:String=null;

        if (query_line == null) return null;

        try {
            val digest1:MessageDigest = MessageDigest.getInstance("MD5");
             val hash:Array[Byte]  =digest1.digest(query_line.getBytes());
            val sb:StringBuilder = new StringBuilder(2*hash.length);

            digest1.update(query_line.getBytes());
            for(b <- hash)
            {
                sb.append("%02x".format( b&0xff));
            }
            md5=sb.toString();
        }
        catch 
        {
        case e:NoSuchAlgorithmException => e.printStackTrace();
        }
         md5
    }

  def memcache_get_result(mysql_table_statement:String)
  {
    var crsi:CachedRowSetImpl=new CachedRowSetImpl();
    var mem_client:MemcachedClient=new MemcachedClient(new BinaryConnectionFactory(), AddrUtil.getAddresses("IP"))

         var obj:Object=null
         Class.forName("com.mysql.jdbc.Driver");

            val conn =  DriverManager.getConnection("jdbc:mysql:IP","user","pass");
        val query_md5_res=MD5encode(mysql_table_statement);
             var future_object=mem_client.asyncGet(query_md5_res);
            try {
                obj=future_object.get(5, TimeUnit.SECONDS);
            }
            catch {

              case t:TimeoutException =>    future_object.cancel(false);
                System.out.println("Memcached timeout...");
            }
            if (obj==null) {
                System.out.print("Query result not in Memcached, ");
                var res:ResultSet = conn.createStatement().executeQuery(mysql_table_statement);
                crsi.populate(res);

                res.close();
                mem_client.set(query_md5_res, 10, crsi);
                while (crsi.next()) {

                  System.out.print("output : " + crsi.getString("COLUMN_ID"));
                }
                crsi.close();
            }
            else  {
                System.out.print("Query result in Memcached, ");
                var crsi_res_set:CachedRowSetImpl=obj.asInstanceOf[CachedRowSetImpl]
                System.out.println(crsi_res_set);
                crsi_res_set.beforeFirst();
                while (crsi_res_set.next()) {

                    System.out.print("output : " + crsi.getString("COLUMN_ID"));
                }
                crsi_res_set.close();
            }

        if (conn != null) {
            conn.close();
        }
  }

   def main(args:Array[String])
    {
      var crsi:CachedRowSetImpl=new CachedRowSetImpl();
      var mem_client:MemcachedClient=new MemcachedClient(new BinaryConnectionFactory(), AddrUtil.getAddresses("IP"))
      memcache_get_result("select statement")
      memcache_get_result("select statement")

        mem_client.shutdown();
    }


}

当我使用 crsi.next() 检索结果时,使用 crsi.getString(Columnname) 获取的列名称没有给出正确的列名称,假设如果我有两到三个列名,其中 A_ID、B_ID、C_ID 所有列名都只是 ID 而不是前缀。因此,当我用 crsi.getString(A_ID) 打印它时,没有结果。

另一件奇怪的事情是我有 2 个 eclipse,其中 1 个有 Maven 构建,另一个有 sbt 构建,其中带有 scala 代码的 Maven 构建工作正常,但带有 sbt 构建的却出现了这个问题。那么罪魁祸首应该是 CachedRowSetImpl 类,但两个相同的 JRE 版本和 rt.jar 都指向 Eclipse 的相同路径。

最佳答案

问题出在 MYSQL JDBC 版本上。 SBT 版本有 mysql jdbc 版本 5.1.5,另一个版本有 5.0.4 MySQL 连接器 jar。删除了 MYSQL jdbc jar 并使用 5.0.4 更新了 MYSQL 连接器 jar 的库依赖项。

关于java - 无法使用 memcached 正确检索列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37004917/

相关文章:

java - 使用 Java Stream 条件映射到新对象

php - 过滤器不起作用(根据参数执行不同的 PHP 查询)

PHP -> 如何在注册查询中绑定(bind)多个值?

java - 堆外数组的直接操作

java - 使GridBagLayout中的组件占据相同的宽度

java - JList AbstractListModel - fireIntervalAdded 和自动滚动到新元素

java - 如何将 Jess(.jar 文件)库转换为 .dex 文件,或在 Android 上运行 java 类文件?

mysql - mysql中的正则表达式捕获组

c++ - 是否可以在 C++11 中创建每个实例的 mixin?

scala - 为什么这里需要括号?