[Seasar-user:15032] Re: [S2JDBC] SQL自動生成のメモリ消費

Takashi ARAKANE [E-MAIL ADDRESS DELETED]
2008年 7月 15日 (火) 11:29:22 JST


荒金と申します。

小林さん、ごめんなさい、ごめんなさい、ごめんなさい。

最初に示したコードですが、@RequiresNewTx の位置が誤っていました。
  誤: @RequiresNewTx public void exec(final int count) { 〜 }
  正: @RequiresNewTx public void insert(final String name) { 〜 }

> Date:    Tue, 15 Jul 2008 04:00:28 +0900

↑な時間に対応していただいたのに orz

手元で修正した後、再度VisualVMでのヒープを見てみました。(添付画像)
結果としては、ResultSet や PreparedStatement が残った状態は同様ですが、

2008/07/15 5:00 Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>:
> このケースで OutOfMemoryError になり,PreparedStatement の
> 作成/クローズをループの内側でするように exec() を
[snip]
> と修正して OOME にならないのであれば,Connector/J の
> 問題というか S2JDBC との相性の問題になりますね.

@RequiresNewTx が、ループの中に存在するということは、
検証用コードにおいてのPreparedStatement の作成/クローズも
下記に示しますとおりループ中になると思うので・・・・・
Connector/J と S2JDBCとの相性が悪いということでしょうか?

public class Employee3Logic {

    public DataSource dataSource;

    public void exec(final int count) {
        for(int i = 0; i < count; i++) {
            String name = new StringBuilder()
                .append("example_")
                .append(i)
                .toString();
            try {
                insert(name);
            } catch(SQLException e) {
                //
            }
        }
    }

    @RequiresNewTx
    public void insert(final String name) throws SQLException {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            con = dataSource.getConnection();
            ps = con.prepareStatement(
                "INSERT INTO employee (name, job_type, salary, version) " +
                "VALUES (?, ?, ?, 1)");
            ps.setString(1, name);
            ps.setString(2, JobType.ANALYST.name());
            ps.setInt(3, 100);
            ps.executeUpdate();
            rs = ps.getGeneratedKeys();
            if(rs.next()) {
                rs.getInt(1);
            }
        } finally {
            rs.close();
            ps.close();
            con.close();
        }
    }

    public static void main(String...args) {
        try {
            SingletonS2ContainerFactory.setConfigPath("app.dicon");
            SingletonS2ContainerFactory.init();
            SingletonS2Container.getComponent(Employee3Logic.class).exec(100000);
        } finally {
            SingletonS2ContainerFactory.destroy();
        }
    }
}

-- 

Takashi ARAKANE <[E-MAIL ADDRESS DELETED]>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: EmployeeLogic.png
Type: image/png
Size: 15147 bytes
Desc: 無し
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20080715/80398fd7/attachment-0002.png>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Employee2Logic.png
Type: image/png
Size: 15405 bytes
Desc: 無し
URL: <http://ml.seasar.org/archives/seasar-user/attachments/20080715/80398fd7/attachment-0003.png>


Seasar-user メーリングリストの案内