1 /* $Id: ClusterConnection.java 94 2008-12-18 11:07:17Z dobashi $
\r
3 * (c)2004 Lavans Networks Inc. All Rights Reserved.
\r
5 package com.lavans.luz2.sql.cluster;
\r
7 import java.sql.Array;
\r
8 import java.sql.Blob;
\r
9 import java.sql.CallableStatement;
\r
10 import java.sql.Clob;
\r
11 import java.sql.Connection;
\r
12 import java.sql.DatabaseMetaData;
\r
13 import java.sql.NClob;
\r
14 import java.sql.PreparedStatement;
\r
15 import java.sql.ResultSet;
\r
16 import java.sql.SQLClientInfoException;
\r
17 import java.sql.SQLException;
\r
18 import java.sql.SQLWarning;
\r
19 import java.sql.SQLXML;
\r
20 import java.sql.Savepoint;
\r
21 import java.sql.Statement;
\r
22 import java.sql.Struct;
\r
23 import java.util.ArrayList;
\r
24 import java.util.HashMap;
\r
25 import java.util.List;
\r
26 import java.util.Map;
\r
27 import java.util.Properties;
\r
29 import org.apache.commons.logging.Log;
\r
30 import org.apache.commons.logging.LogFactory;
\r
34 * クラスタ接続用Connectionクラス。
\r
36 * Connectionクラスに対して行う設定処理(setAutoCommit()等)は、
\r
37 * 更新処理を行う前に実行しておくこと。DB切替が発生した際に、
\r
38 * AutoCommitがTrueの時に作成したStatementは再実行されない。
\r
41 * クラスタ接続ではセーブポイントの管理は行わない。
\r
42 * SQLWarningsはDB切替時に引き継がれない。
\r
47 public class ClusterConnection implements Connection {
\r
48 /** Messageクラスに移動? */
\r
49 private static final String MSG_WARN_SWITCH_DB="障害が出たので接続先を切り替えます。";
\r
50 // private static final String MSG_ERR_RECREATE="Statementの再生成に失敗。";
\r
52 private Connection con=null;
\r
55 * コネクションプール。障害時に別のコネクションを取得するため、
\r
56 * インスタンス変数として参照しておく必要がある。
\r
58 private ClusterConnectionPool pool = null;
\r
61 * setAutoCommit実行フラグ。
\r
62 * setAutoCommit()を明示的に呼ばないでクラスタの切り替えが起こった際に、
\r
63 * 新しいConnectionでsetAutoCommit()を実行しないようにする。
\r
64 * executeBatch内でSET TRANSACTIONしている時などにこの判断が必要。
\r
67 // private boolean setAutoCommitFlag = false; //
\r
70 * 保存しておくConnectionの状態。
\r
71 * 障害が発生した場合、Connectionに対する操作(setAutoCommit()等)を
\r
74 private boolean isAutoCommit = true;
\r
75 private String catalog = null;
\r
76 private int holdability = ResultSet.CLOSE_CURSORS_AT_COMMIT;
\r
77 private boolean isReadOnly = false;
\r
78 private int transactionIsolation = TRANSACTION_READ_COMMITTED;
\r
79 private Map<String, Class<?>> typeMap = null;
\r
82 * Statement/PreparedStatement保存用リスト。
\r
83 * 作成した順序を保存しておかなければならないので
\r
84 * List型にて保存する。各Statementを作成したときの引数は
\r
87 private List<ClusterStatement> statementList = null;
\r
90 * Statement/PreparedStatementを作成したときの引数保存用。
\r
91 * 障害時にStatementを再作成するのに必要。
\r
92 * キーはStatement,値が作成時の引数を入れたCalledMethod。
\r
93 * 障害時にはまだclose()されていないStatementに対して
\r
96 private Map<ClusterStatement, CalledMethod> statementMap = null;
\r
99 private static Log logger = LogFactory.getLog(ClusterConnection.class);
\r
103 * @throws SQLException
\r
105 public ClusterConnection(Connection con, ClusterConnectionPool pool) throws SQLException{
\r
108 // methodList = new ArrayList();
\r
109 statementList = new ArrayList<ClusterStatement> ();
\r
110 statementMap = new HashMap<ClusterStatement, CalledMethod> ();
\r
111 // prepareMap = new HashMap();
\r
113 // 障害時にコネクションに対して行った操作を再実行できるように保持しておく。
\r
114 isAutoCommit = con.getAutoCommit();
\r
115 catalog = con.getCatalog();
\r
116 // Oracle9が未サポートのためコメントアウト
\r
117 //holdability = con.getHoldability();
\r
118 isReadOnly = con.isReadOnly();
\r
119 transactionIsolation = con.getTransactionIsolation();
\r
120 typeMap = con.getTypeMap();
\r
126 * ClusterConnectionPoolから取得するときに呼ばれる。
\r
129 // public void init(){
\r
130 // methodList.clear();
\r
131 // statementList.clear();
\r
132 // statementMap.clear();
\r
136 * クラスタリング対応のメソッド実行処理。
\r
137 * @param methodName
\r
140 * @throws SQLException
\r
142 private Object clusterCall(String methodName, Object[] args, Class<?>[] parameterTypes) throws SQLException{
\r
143 return clusterCall(new CalledMethod(methodName, args, parameterTypes));
\r
147 * クラスタリング対応のメソッド実行処理。
\r
148 * @param calledMethod
\r
150 * @throws SQLException
\r
152 private Object clusterCall(CalledMethod calledMethod) throws SQLException{
\r
153 logger.debug( calledMethod.toString());
\r
155 Object result = null;
\r
157 result = calledMethod.invoke(con);
\r
158 }catch (Exception e) {
\r
160 logger.error(MSG_WARN_SWITCH_DB, e.getCause());
\r
161 }catch (Exception e2) {
\r
162 // getCause()に失敗した時用
\r
163 logger.error(MSG_WARN_SWITCH_DB, e);
\r
165 try { con.close(); } catch (SQLException se) {}
\r
166 con = pool.getAnotherConnection(this);
\r
168 // コネクションに対して行った操作を再実行する。
\r
169 con.setAutoCommit(isAutoCommit);
\r
170 con.setCatalog(catalog);
\r
171 con.setHoldability(holdability);
\r
172 con.setReadOnly(isReadOnly);
\r
173 con.setTransactionIsolation(transactionIsolation);
\r
174 con.setTypeMap(typeMap);
\r
176 // 過去に作成したStatementへ再更新処理を依頼する。
\r
177 for(int i=0; i<statementList.size(); i++){
\r
178 ClusterStatement cst = statementList.get(i);
\r
179 CalledMethod method = statementMap.get(cst);
\r
180 Statement st = (Statement)method.invoke(con); // Statementを再生成
\r
181 cst.reupdateStatement(st);
\r
185 result = calledMethod.invoke(con);
\r
186 }catch (Exception e2) {
\r
187 // 再度実行。ここでもさらにエラーがでるならSQLExceptionにラップする。
\r
188 throw new SQLException(e2.getMessage());
\r
198 * Statement#close()でこれを呼ぶ必要がある。
\r
200 public void remove(Statement st){
\r
201 statementList.remove(st);
\r
202 statementMap.remove(st);
\r
206 * PrepareStatement#close()でこれを呼ぶ必要がある。
\r
208 // public void remove(PreparedStatement st){
\r
209 // prepareMap.remove(st);
\r
214 * ClusterStatementから呼ばれる。エラーを通知してきたStatementに対しては
\r
215 * autoCommitの状態にかかわらずネイティブなStatementを返す。
\r
217 * 保存してあるすべてのStatementに対して、過去に実行した
\r
220 public void notifyError(ClusterStatement src) throws SQLException{
\r
222 try{ con.rollback(); con.close(); }catch (SQLException e) {}
\r
225 con = pool.getAnotherConnection(this);
\r
226 // コネクションに対して行った操作を再実行する。
\r
227 con.setAutoCommit(isAutoCommit);
\r
228 con.setTransactionIsolation(transactionIsolation);
\r
229 con.setCatalog(catalog);
\r
230 // Oracle9iが対応していないので削除
\r
231 //con.setHoldability(holdability);
\r
232 con.setReadOnly(isReadOnly);
\r
233 con.setTypeMap(typeMap);
\r
235 // 過去に作成したStatementへ再更新処理を依頼する。
\r
236 for(int i=0; i<statementList.size(); i++){
\r
237 ClusterStatement cst = statementList.get(i);
\r
238 if(src==cst){ // エラーの通知元にはstatementListに無くてもStatementを渡す。
\r
241 CalledMethod method = statementMap.get(cst);
\r
242 Statement st = (Statement)method.invoke(con); // Statementを再生成
\r
243 cst.reupdateStatement(st);
\r
246 // エラーの通知元にはstatementListに無くてもStatementを渡す。
\r
247 CalledMethod method = statementMap.get(src);
\r
248 Statement st = (Statement)method.invoke(con); // Statementを再生成
\r
249 src.reupdateStatement(st);
\r
251 }catch (SQLException e) {
\r
253 }catch (Exception e) {
\r
254 // それ以外のエラーが出た場合はSQLExceptionとしてスローする。
\r
255 throw new SQLException(e.getMessage());
\r
262 * ClusterPreparedStatementから呼ばれる。
\r
263 * ClusterPrStatementのインスタンスは消滅せずに、内部で持っている
\r
264 * Statementへの参照を切り替えるだけなので、ネイティブなStatementを返す。
\r
266 // public PreparedStatement getAnotherPreparedStatement(PreparedStatement pst) throws SQLException{
\r
267 // // 既存のconを破棄してみる。
\r
268 // try{ con.close(); }catch (SQLException e) {}
\r
270 // con = pool.getAnotherConnection(this);
\r
272 // // 前にPreparedStatementを作ったときの引数を取得。
\r
273 // Object[] objs = (Object[])prepareMap.get(pst);
\r
274 // Class<?>[] cls = null;
\r
275 // if(objs!=null){ // objsがnull(=引数無し)の時はclsもnullで良い。prepareStatementではあり得ないはず。
\r
276 // cls = new Class[objs.length];
\r
277 // for(int i=0; i<objs.length; i++){
\r
278 // cls[i] = objs[i].getClass();
\r
282 // // 新しいPreparedStatementの取得。
\r
283 // // 失敗したらSQLExceptionでスローする。
\r
284 // PreparedStatement st = null;
\r
286 // Method method = con.getClass().getMethod("prepareStatement",cls);
\r
287 // st = (PreparedStatement)method.invoke(con, objs);
\r
288 // }catch (Exception e) {
\r
289 // throw new SQLException(MSG_ERR_RECREATE+e.getMessage());
\r
295 * @see java.sql.Connection#createStatement()
\r
297 public Statement createStatement() throws SQLException {
\r
298 CalledMethod method = new CalledMethod("createStatement", null, null);
\r
300 Statement st = (Statement)clusterCall(method);
\r
301 ClusterStatement cst = new ClusterStatement(this, st);
\r
302 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
303 statementList.add(cst); // 再実行に備えてとっておく。
\r
304 statementMap.put(cst, method);
\r
310 * @see java.sql.Connection#createStatement(int, int)
\r
312 public Statement createStatement(
\r
314 int resultSetConcurrency)
\r
315 throws SQLException {
\r
316 Object[] args = new Object[]{
\r
317 new Integer(resultSetType),
\r
318 new Integer(resultSetConcurrency)
\r
320 Class<?>[] types = new Class<?>[]{
\r
324 CalledMethod method = new CalledMethod("createStatement", args, types);
\r
326 Statement st = (Statement)clusterCall(method);
\r
327 ClusterStatement cst = new ClusterStatement(this, st);
\r
328 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
329 statementList.add(cst); // 再実行に備えてとっておく。
\r
330 statementMap.put(cst, method);
\r
336 * Holdability指定付きStatement生成。
\r
337 * ただしOracleは無条件で例外をスローする。
\r
338 * @see java.sql.Connection#createStatement(int, int, int)
\r
340 public Statement createStatement(
\r
342 int resultSetConcurrency,
\r
343 int resultSetHoldability)
\r
344 throws SQLException {
\r
345 Object[] args = new Object[]{
\r
346 new Integer(resultSetType),
\r
347 new Integer(resultSetConcurrency),
\r
348 new Integer(resultSetHoldability)
\r
350 Class<?>[] types = new Class<?>[]{
\r
355 CalledMethod method = new CalledMethod("createStatement", args, types);
\r
357 Statement st = (Statement)clusterCall(method);
\r
358 ClusterStatement cst = new ClusterStatement(this, st);
\r
359 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
360 statementList.add(cst); // 再実行に備えてとっておく。
\r
361 statementMap.put(cst, method);
\r
367 * @see java.sql.Connection#prepareCall(java.lang.String)
\r
369 public CallableStatement prepareCall(String sql) throws SQLException {
\r
370 ClusterCallableStatement cst = new ClusterCallableStatement(this, con.prepareCall(sql));
\r
371 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
372 statementList.add(cst); // 再実行に備えてとっておく。
\r
378 * @see java.sql.Connection#prepareCall(java.lang.String, int, int)
\r
380 public CallableStatement prepareCall(
\r
383 int resultSetConcurrency)
\r
384 throws SQLException {
\r
385 ClusterCallableStatement cst = new ClusterCallableStatement(this, con.prepareCall(sql,resultSetType,resultSetConcurrency));
\r
386 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
387 statementList.add(cst); // 再実行に備えてとっておく。
\r
393 * @see java.sql.Connection#prepareCall(java.lang.String, int, int, int)
\r
395 public CallableStatement prepareCall(
\r
398 int resultSetConcurrency,
\r
399 int resultSetHoldability)
\r
400 throws SQLException {
\r
401 ClusterCallableStatement cst = new ClusterCallableStatement(this, con.prepareCall(sql,resultSetType,resultSetConcurrency,resultSetHoldability));
\r
402 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
403 statementList.add(cst); // 再実行に備えてとっておく。
\r
409 * @see java.sql.Connection#prepareStatement(java.lang.String)
\r
411 public PreparedStatement prepareStatement(String sql) throws SQLException {
\r
412 Object[] args = new Object[]{
\r
415 Class<?>[] types = new Class<?>[]{
\r
418 CalledMethod method = new CalledMethod("prepareStatement", args, types);
\r
420 PreparedStatement st = (PreparedStatement)clusterCall(method);
\r
421 ClusterPreparedStatement cst = new ClusterPreparedStatement(this, st);
\r
422 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
423 statementList.add(cst); // 再実行に備えてとっておく。
\r
424 statementMap.put(cst, method);
\r
430 * @see java.sql.Connection#prepareStatement(java.lang.String, int)
\r
432 public PreparedStatement prepareStatement(
\r
434 int autoGeneratedKeys)
\r
435 throws SQLException {
\r
436 Object[] args = new Object[]{
\r
438 new Integer(autoGeneratedKeys)
\r
440 Class<?>[] types = new Class<?>[]{
\r
444 CalledMethod method = new CalledMethod("prepareStatement", args, types);
\r
446 PreparedStatement st = (PreparedStatement)clusterCall(method);
\r
447 ClusterPreparedStatement cst = new ClusterPreparedStatement(this, st);
\r
448 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
449 statementList.add(cst); // 再実行に備えてとっておく。
\r
450 statementMap.put(cst, method);
\r
456 * @see java.sql.Connection#prepareStatement(java.lang.String, int, int)
\r
458 public PreparedStatement prepareStatement(
\r
461 int resultSetConcurrency)
\r
462 throws SQLException {
\r
463 Object[] args = new Object[]{
\r
465 new Integer(resultSetType),
\r
466 new Integer(resultSetConcurrency)
\r
468 Class<?>[] types = new Class<?>[]{
\r
473 CalledMethod method = new CalledMethod("prepareStatement", args, types);
\r
475 PreparedStatement st = (PreparedStatement)clusterCall(method);
\r
476 ClusterPreparedStatement cst = new ClusterPreparedStatement(this, st);
\r
477 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
478 statementList.add(cst); // 再実行に備えてとっておく。
\r
479 statementMap.put(cst, method);
\r
485 * @see java.sql.Connection#prepareStatement(java.lang.String, int, int, int)
\r
487 public PreparedStatement prepareStatement(
\r
490 int resultSetConcurrency,
\r
491 int resultSetHoldability)
\r
492 throws SQLException {
\r
493 Object[] args = new Object[]{
\r
495 new Integer(resultSetType),
\r
496 new Integer(resultSetConcurrency),
\r
497 new Integer(resultSetHoldability)
\r
499 Class<?>[] types = new Class<?>[]{
\r
505 CalledMethod method = new CalledMethod("prepareStatement", args, types);
\r
507 PreparedStatement st = (PreparedStatement)clusterCall(method);
\r
508 ClusterPreparedStatement cst = new ClusterPreparedStatement(this, st);
\r
509 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
510 statementList.add(cst); // 再実行に備えてとっておく。
\r
511 statementMap.put(cst, method);
\r
517 * @see java.sql.Connection#prepareStatement(java.lang.String, int[])
\r
519 public PreparedStatement prepareStatement(String sql, int[] columnIndexes)
\r
520 throws SQLException {
\r
521 Object[] args = new Object[]{sql, columnIndexes};
\r
522 Class<?>[] types = new Class<?>[]{
\r
526 CalledMethod method = new CalledMethod("prepareStatement", args, types);
\r
528 PreparedStatement st = (PreparedStatement)clusterCall(method);
\r
529 ClusterPreparedStatement cst = new ClusterPreparedStatement(this, st);
\r
530 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
531 statementList.add(cst); // 再実行に備えてとっておく。
\r
532 statementMap.put(cst, method);
\r
538 * @see java.sql.Connection#prepareStatement(java.lang.String, java.lang.String[])
\r
540 public PreparedStatement prepareStatement(String sql, String[] columnNames)
\r
541 throws SQLException {
\r
542 Object[] args = new Object[]{sql,columnNames};
\r
543 Class<?>[] types = new Class<?>[]{
\r
547 CalledMethod method = new CalledMethod("prepareStatement", args, types);
\r
549 PreparedStatement st = (PreparedStatement)clusterCall(method);
\r
550 ClusterPreparedStatement cst = new ClusterPreparedStatement(this, st);
\r
551 if(!getAutoCommit()){ // 自動コミットじゃない場合だけ
\r
552 statementList.add(cst); // 再実行に備えてとっておく。
\r
553 statementMap.put(cst, method);
\r
559 * @see java.sql.Connection#getHoldability()
\r
561 public int getHoldability() throws SQLException {
\r
562 return holdability;
\r
563 // return ((Integer)clusterCall("getHoldability", null, null)).intValue();
\r
567 * @see java.sql.Connection#getTransactionIsolation()
\r
569 public int getTransactionIsolation() throws SQLException {
\r
570 return transactionIsolation;
\r
571 // return ((Integer)clusterCall("getTransactionIsolation", null, null)).intValue();
\r
575 * @see java.sql.Connection#clearWarnings()
\r
577 public void clearWarnings() throws SQLException {
\r
578 clusterCall("clearWarnings", null, null);
\r
582 * @see java.sql.Connection#close()
\r
584 public void close() throws SQLException {
\r
585 clusterCall("close", null, null);
\r
586 // コネクションを閉じてしまったので以前のメソッドは再実行する必要なし。
\r
587 statementList.clear();
\r
588 statementMap.clear();
\r
592 * @see java.sql.Connection#commit()
\r
594 public void commit() throws SQLException {
\r
595 clusterCall("commit", null, null);
\r
596 // 過去の更新処理は再実行する必要なし。
\r
597 statementList.clear();
\r
598 statementMap.clear();
\r
603 * @see java.sql.Connection#rollback()
\r
605 public void rollback() throws SQLException {
\r
606 clusterCall("rollback", null, null);
\r
607 // 過去の更新処理は再実行する必要なし。
\r
608 statementList.clear();
\r
609 statementMap.clear();
\r
614 * @see java.sql.Connection#getAutoCommit()
\r
616 public boolean getAutoCommit() throws SQLException {
\r
617 return isAutoCommit;
\r
618 // return ((Boolean)clusterCall("getAutoCommit", null, null)).booleanValue();
\r
622 * @see java.sql.Connection#isClosed()
\r
624 public boolean isClosed() throws SQLException {
\r
625 return ((Boolean)clusterCall("isClosed", null, null)).booleanValue();
\r
629 * @see java.sql.Connection#isReadOnly()
\r
631 public boolean isReadOnly() throws SQLException {
\r
633 // return ((Boolean)clusterCall("isReadOnly", null, null)).booleanValue();
\r
637 * @see java.sql.Connection#setHoldability(int)
\r
639 public void setHoldability(int holdability) throws SQLException {
\r
640 clusterCall("setHoldability", new Object[]{new Integer(holdability)},
\r
641 new Class<?>[]{Integer.TYPE});
\r
642 this.holdability = holdability;
\r
646 * @see java.sql.Connection#setTransactionIsolation(int)
\r
648 public void setTransactionIsolation(int level) throws SQLException {
\r
649 clusterCall("setTransactionIsolation", new Object[]{new Integer(level)},
\r
650 new Class<?>[]{Integer.TYPE});
\r
651 transactionIsolation = level;
\r
656 * @see java.sql.Connection#setAutoCommit(boolean)
\r
658 public void setAutoCommit(boolean autoCommit) throws SQLException {
\r
659 clusterCall("setAutoCommit", new Object[]{new Boolean(autoCommit)},
\r
660 new Class<?>[]{Boolean.TYPE});
\r
661 isAutoCommit = autoCommit;
\r
663 // この時点でコミットが行われるので、過去の更新処理はクリアする。
\r
664 statementList.clear();
\r
665 statementMap.clear();
\r
669 * @see java.sql.Connection#setReadOnly(boolean)
\r
671 public void setReadOnly(boolean readOnly) throws SQLException {
\r
672 clusterCall("setReadOnly", new Object[]{new Boolean(readOnly)},
\r
673 new Class<?>[]{Boolean.TYPE});
\r
674 isReadOnly = readOnly;
\r
678 * @see java.sql.Connection#getCatalog()
\r
680 public String getCatalog() throws SQLException {
\r
682 // return (String)clusterCall("getCatalog", null, null);
\r
687 * @see java.sql.Connection#setCatalog(java.lang.String)
\r
689 public void setCatalog(String setCatalog) throws SQLException {
\r
690 clusterCall("setCatalog", new Object[]{setCatalog},
\r
691 new Class<?>[]{String.class});
\r
692 this.catalog = setCatalog;
\r
696 * Oracle10gののojdbc14に合わせてsynchronizedにする。
\r
697 * @see java.sql.Connection#getMetaData()
\r
699 public synchronized DatabaseMetaData getMetaData() throws SQLException {
\r
700 return (DatabaseMetaData)clusterCall("getMetaData", null, null);
\r
704 * @see java.sql.Connection#getWarnings()
\r
706 public SQLWarning getWarnings() throws SQLException {
\r
707 return (SQLWarning)clusterCall("getWarnings", null, null);
\r
712 * クラスタ接続ではセーブポイントの管理は行わない。
\r
714 * @see java.sql.Connection#setSavepoint()
\r
716 public Savepoint setSavepoint() throws SQLException {
\r
717 throw new UnsupportedOperationException();
\r
718 // con.setSavepoint();
\r
723 * クラスタ接続ではセーブポイントの管理は行わない。
\r
724 * @see java.sql.Connection#releaseSavepoint(java.sql.Savepoint)
\r
726 public void releaseSavepoint(Savepoint savepoint) throws SQLException {
\r
727 throw new UnsupportedOperationException();
\r
728 //con.releaseSavepoint(savepoint);
\r
732 * 指定のセーブポイントまでのロールバック。
\r
733 * クラスタ接続ではセーブポイントの管理は行わない。
\r
734 * @see java.sql.Connection#rollback(java.sql.Savepoint)
\r
736 public void rollback(Savepoint savepoint) throws SQLException {
\r
737 throw new UnsupportedOperationException();
\r
738 //con.rollback(savepoint);
\r
743 * @see java.sql.Connection#getTypeMap()
\r
745 public Map<String, Class<?>> getTypeMap() throws SQLException {
\r
747 // return (Map)clusterCall("getTypeMap", null, null);
\r
751 * @see java.sql.Connection#setTypeMap(java.util.Map)
\r
753 public void setTypeMap(Map<String, Class<?>> map) throws SQLException {
\r
754 clusterCall("setTypeMap", new Object[]{map},
\r
755 new Class<?>[]{Map.class});
\r
756 this.typeMap = map;
\r
760 * @see java.sql.Connection#nativeSQL(java.lang.String)
\r
762 public String nativeSQL(String sql) throws SQLException {
\r
763 return (String)clusterCall("nativeSQL", new Object[]{sql},
\r
764 new Class<?>[]{String.class});
\r
769 * クラスタ接続ではセーブポイントの管理は行わない。
\r
770 * @see java.sql.Connection#setSavepoint(java.lang.String)
\r
772 public Savepoint setSavepoint(String name) throws SQLException {
\r
773 throw new UnsupportedOperationException();
\r
774 // return con.setSavepoint(name);
\r
781 public Array createArrayOf(String arg0, Object[] arg1) throws SQLException {
\r
782 // TODO 自動生成されたメソッド・スタブ
\r
786 public Blob createBlob() throws SQLException {
\r
787 // TODO 自動生成されたメソッド・スタブ
\r
791 public Clob createClob() throws SQLException {
\r
792 // TODO 自動生成されたメソッド・スタブ
\r
796 public NClob createNClob() throws SQLException {
\r
797 // TODO 自動生成されたメソッド・スタブ
\r
801 public SQLXML createSQLXML() throws SQLException {
\r
802 // TODO 自動生成されたメソッド・スタブ
\r
806 public Struct createStruct(String arg0, Object[] arg1) throws SQLException {
\r
807 // TODO 自動生成されたメソッド・スタブ
\r
811 public Properties getClientInfo() throws SQLException {
\r
812 // TODO 自動生成されたメソッド・スタブ
\r
816 public String getClientInfo(String arg0) throws SQLException {
\r
817 // TODO 自動生成されたメソッド・スタブ
\r
821 public boolean isValid(int arg0) throws SQLException {
\r
822 // TODO 自動生成されたメソッド・スタブ
\r
826 public void setClientInfo(Properties arg0) throws SQLClientInfoException {
\r
827 // TODO 自動生成されたメソッド・スタブ
\r
831 public void setClientInfo(String arg0, String arg1)
\r
832 throws SQLClientInfoException {
\r
833 // TODO 自動生成されたメソッド・スタブ
\r
837 public boolean isWrapperFor(Class<?> iface) throws SQLException {
\r
838 // TODO 自動生成されたメソッド・スタブ
\r
842 public <T> T unwrap(Class<T> iface) throws SQLException {
\r
843 // TODO 自動生成されたメソッド・スタブ
\r