memcachedを使用してMYSQLデータをキャッシュするためのスカラコードがあります。以下はコードです。memcachedで列名を正しく取得できません。
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.getString(Columnname)
で取得crsi.next()
列名で結果を取得し、すべての列名が正しい列名を与える、私はA_ID、B_IDで2〜3列名を持っている場合と仮定し、C_IDはありませんプレフィックスの代わりにIDだけです。だから、私はcrsi.getString(A_ID)を使ってそれを印刷しても結果はありません。
もう1つの奇妙なことは、私は2つの日食を持っている、1はmavenビルドと他のsbtビルドを持っている、maven build with scala codeはうまく動作するが、sbtビルドのものはこの問題を起こしている。次に、犯人はCachedRowSetImplクラスでなければなりませんが、同じJREバージョンとrt.jarの両方が、両方のEclipseの同じパスを指しています。