【发布时间】:2016-05-03 21:44:19
【问题描述】:
我有一个使用 memcached 缓存 MYSQL 数据的 scala 代码。下面是代码。
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 的相同路径。
【问题讨论】:
标签: java mysql scala memcached