我有一个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) 打印它时,没有结果。
最佳答案
问题出在 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/