ページの先頭行へ戻る
Symfoware Server V10.0.1 Connection Managerユーザーズガイド(9.x)

5.3.2 Javaアプリケーションの作成例

Javaアプリケーションでは、getSQLStateメソッドでSQLSTATE値を取得し、エラー状態を認識します。

以降にJavaアプリケーションでの作成例を記載していますが、EJBアプリケーション、サーブレットおよびJSPの場合にも、SQLSTATE値を判定することより、Connection Managerを利用することができます。

参照

その他のアプリケーション作成例については、“アプリケーション開発ガイド(JDBCドライバ編)”を参照してください。


ここではロードシェア運用の場合の例を示します。

JDBC APIを使用したアプリケーションの作成例

import java.sql.*;
import java.util.Hashtable;
import java.net.URL;
import javax.sql.DataSource;
import javax.naming.*;

/*
* JdbcSample1.java
* 内容:JDBC APIを使用したアプリケーションの作成例
*/
class JdbcSample1
{
    /*** メイン ***/
    public static void main(String args[])
    {
        try
        {
            int result = -1;

            /* CONNECT */
            DBAccess dbAccess = new DBAccess();
            /* PREPARE */
            dbAccess.createObj();

            while (result == -1)

            {
                /* EXECUTE */
                result = dbAccess.exec();

                // SQLStateが40003,40703,71410の場合、再度exec()を実行。
                if(result == -2 | result == -3)
                {
                    result = -1;
                }

                // 正常終了か、その他のエラーの場合、アプリ終了
                else
                {
                    break;
                }
            }

            /* DISCONNECT */
            dbAccess.close();
        }
        catch(Exception e)
        {
            /* 異常系処理 */
            e.printStackTrace();
        }
    }
}
/*
* データベースアクセス処理
*/
class DBAccess
{
    private Connection            con  = null;
    private PreparedStatement    pstmt = null;
    private int              iRollback = 0;

    /* データベースへ接続 */
    DBAccess()
    {
        try
        {
            Hashtable            env = null;
            DataSource            ds = null;
            Context              ctx = null;

            String    sDataSourceName = "DS1";
            String    sProviderName   = "com.fujitsu.symfoware.jdbc2.jndisp.SYMContextFactory";
            String    sProviderURL    = "SYM://localhost:26600";

            env = new Hashtable();
            env.put(Context.INITIAL_CONTEXT_FACTORY, sProviderName);
            env.put(Context.PROVIDER_URL, sProviderURL);

            ctx = new InitialContext(env);

            String key_ = "jdbc/" + sDataSourceName;
            ds          = (DataSource)ctx.lookup(key_);

            /* データベースへ接続 */
            con = ds.getConnection();

            /*手動コミットモードの設定 */
            con.setAutoCommit(false);

        }
        catch (SQLException e)
        {
            System.out.println(e.getMessage());
            System.out.println("SQLState = <" + e.getSQLState()
                                + ">, Code = <"+ e.getErrorCode() + ">");
            e.printStackTrace();
        }
        catch (NamingException e)
        { 
            e.printStackTrace();
        }
    }

     /*
     * ステートメントを作成 
     */
    public void createObj()
    {
        String sSQLInsert = "INSERT INTO SCM1.CATEGORY1 VALUES(?, 'NAME')";

        try
        {
            /* PreparedStatementクラスのオブジェクトを作成 */
            pstmt = con.prepareStatement(sSQLInsert);
        }
        catch (SQLException e)
        {
            System.out.println(e.getMessage());
            System.out.println("SQLState = <" + e.getSQLState()
                                + ">, Code = <"+ e.getErrorCode() + ">");
            e.printStackTrace();
        }
    }
    /*
     * SQL文の実行
     */
    public int exec()
    {
        int result = -1;
        try
        {
            // SQLSTATEが71410の場合、rollbackする。
            if(iRollback == 1)
            {
                con.rollback();
                pstmt.close();
                createObj();
                iRollback = 0;
            }

            /* データを5件挿入 */
            for (int i = 1; i <= 5; i++)
            {
                pstmt.setInt(1, i);
                result = pstmt.executeUpdate();
            }

            /* PreparedStatementクラスのオブジェクトをクローズ */
            pstmt.close();

            /*トランザクションをコミット */
            con.commit();
        }
        catch (SQLException e)
        {
            String sErr1 = "40003";
            String sErr2 = "40703";
            String sErr3 = "71410";
            String sErr4 = "71003";

            String prefix = e.getSQLState();

            // SQLSTATEが40003か40703の場合、再実行する。
            if (prefix.equals(sErr1) || prefix.equals(sErr2))
            {
                result = -2;
            }

            // SQLSTATEが71410か71003の場合、再実行する。
            // rollbackするフラグも立てる。
            else if (prefix.equals(sErr3) || prefix.equals(sErr4))
            {
                result = -3;
                iRollback = 1;
            }

            // その他のエラーの場合、エラーを返却する。
            else
            {
                System.out.println(e.getMessage());
                System.out.println("SQLState = <" + e.getSQLState()
                                  + ">, Code = <"+ e.getErrorCode() + ">");
                result = 1;
            }
        }
        return result;
    }
    /*
     * オブジェクトの回収処理
     */
    public void close()
    {
        try
        {
            // Connectionクラスのオブジェクトをクローズ
            con.close();
        }
        catch (SQLException e)
        {
            System.out.println(e.getMessage());
            System.out.println("SQLState = <" + e.getSQLState()
                                + ">, Code = <"+ e.getErrorCode() + ">");
            e.printStackTrace();
        }
    }
}