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

Takashi ARAKANE [E-MAIL ADDRESS DELETED]
2008年 7月 14日 (月) 14:48:35 JST


荒金と申します。

JdbcManager での SQL自動生成を行った場合と、updateBySqlを使用した場合とで、
メモリの消費の仕方が明らかに異なるように思います。

s2jdbc-tutorial を MySQL を使うように変更し、次の2つのコードを実行してみました。
EmployeeLogic がSQL自動生成版で、Employee2Logicが updateBySql版です。

---------- ここから

public class EmployeeLogic {

    public JdbcManager jdbcManager;

    @RequiresNewTx
    public void exec(final int count) {
        for(int i = 0; i < count; i++) {
            String name = new StringBuilder()
                .append("example_")
                .append(i)
                .toString();
            insert(name);
        }
    }

    public void insert(final String name) {
        Employee emp = new Employee();
        emp.name = name;
        emp.jobType = JobType.ANALYST;
        emp.salary = 100;
        emp.version = 1;
        jdbcManager.insert(emp).execute();
    }

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

---------- ここまで

---------- ここから

public class Employee2Logic {

    public JdbcManager jdbcManager;

    @RequiresNewTx
    public void exec(final int count) {
        for(int i = 0; i < count; i++) {
            String name = new StringBuilder()
                .append("example_")
                .append(i)
                .toString();
            insert(name);
        }
    }

    public void insert(final String name) {
        jdbcManager
            .updateBySql(
                "INSERT INTO employee (name, job_type, salary, version) " +
                "VALUES (?, ?, ?, 1)",
                String.class, String.class, Integer.class)
            .params(name, JobType.ANALYST, 100)
            .execute();
    }

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

---------- ここまで

10万回 insert を行うという、単純なものなのです。

特に -Xmx 等を指定せずに実行した場合には、EmployeeLogic の方は
徐々にメモリを消費していき、80MBytesを超えた後 OutOfMemoryが発生しますが、
Employee2Logic の方は、25MBytes程度の消費で安定しています。

使い方で、私が大きく勘違いしているのでしょうか?
S2 は 2.4.26、MySQL Connector/J は 5.1.6を使用して検証いたしました。

-- 

Takashi ARAKANE <[E-MAIL ADDRESS DELETED]>


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