GAE/JでSQLをどうしても使いたい方に朗報。jiqlというものを使えば、jdbc clientとしてBigTableに実際に保存されたデータにアクセスできるようになる。
これを使えるようにするには、jiqlのページから、jiql.jarとjiql.jspをダウンロードして、GAEアプリケーションに配置すればよい。それぞれ、WEB-INF/lib/の下と、./に置く。
ただし、jiql.jspにはBugがあり、jspコンパイル時にエラーとなるため、以下のように修正する。(try catchのスコープ外でString sql=""を定義する)
jiql testpage
jiql testpageでは、hostやuser、password、datasourcenameを入れる箇所があるが、とりあえず何も入れないで、exampleのsqlを入れてqueryボタンを押すだけで実行結果が見れる。
ただ、JOINが使えないのを見ればわかるように、まだクラウドでSQLを使うのは無理があるように思う。将来使えるようになったとしても、トランザクションやパフォーマンスのことを考慮すると、結局クラウドの作法に立ち戻るはめになるだろう。個人的には、トランザクションプロセッシングを司るアプリからはSQLを無理に使うべきでないと思うし、使ったところで結局はO/Rマッパが必要となるので嬉しくない。
SQLが真価を発揮するのは情報系データベースである。これは別システムとして立てることで、クラウドからデータを受け渡すようにすればよいと思う。
・・・
ResultSet result = null;
Connection Conn = null;
String status = "";
String url = "jdbc:jiql://local";
String host = "";
String password = "";
String user = "";
String dsName = "";
String sql ="";
if (request.getParameter("query") != null){
try{
sql = request.getParameter("sql");
if (sql == null || sql.length() < 1)
throw new SQLException("Please Enter a valid SQL Statement!");
Properties props = new Properties();
props.put("user",user);
props.put("password",password);
Class clazz = Class.forName("org.jiql.jdbc.Driver");
Driver driver = (Driver) clazz.newInstance();
Conn = driver.connect(url,props);
Statement Stmt = Conn.createStatement();
Stmt.execute(sql);
result = Stmt.getResultSet();
status = sql + "
SQL COMPLETED SUCESSFULLY";
}catch (Exception ex){
status = "" + sql + "
SQL FAILED " + ex.toString() + "";
ex.printStackTrace(response.getWriter());
}
//Conn.close();
}
・・・
以下同じ
0 件のコメント:
コメントを投稿