package message.datasource.key.sequence;
import message.datasource.key.AbstractMaxValueIncrementer;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 所有利用sequence实现主键自增长的数据库均需继承此类,并实现getQuerySequence方法
*
* @author sunhao(sunhao.java@gmail.com)
* @version V1.0, 2012-4-11 上午08:45:39
*/
public abstract class AbstractSequenceMaxValueIncrementer extends AbstractMaxValueIncrementer {
protected long getNextKey(String name) {
Connection conn = DataSourceUtils.getConnection(getDataSource());
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
DataSourceUtils.applyTransactionTimeout(stmt, getDataSource());
String sql = getQuerySequence(name);
rs = stmt.executeQuery(sql);
if(rs.next())
return rs.getLong(1);
else
throw new DataAccessResourceFailureException("can not get any return from sequence '" + name + "' you give");
} catch(SQLException e) {
throw new DataAccessResourceFailureException("not found sequence you give '" + name + "'");
} finally {
JdbcUtils.closeResultSet(rs);
JdbcUtils.closeStatement(stmt);
DataSourceUtils.releaseConnection(conn, getDataSource());
}
}
/**
* query next sequence sql
*
* @param name sequence name
* @return
*/
public abstract String getQuerySequence(String name);
}