다음은 sequence incrementer를 지원하지 않는 MariaDB 을 사용하는 경우의 예시입니다.
<beans ...> <bean id="dao" class="com.poscoict.glueframework.dao.jdbc.GlueJdbcDao"> <property name="dataSource"><ref local="dataSource"/></property> <property name="queryManager"><ref local="queryManager"/></property> <property name="sequence"><ref local="sequence"/></property> </bean> <bean id="sequence" class="MySQLSequence"> <constructor-arg><ref local="dataSource"/></constructor-arg> </bean> </beans>
import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class MySQLSequence implements GlueSequence{ private DataSource dataSource; public MySQLSequence( DataSource ds ){ this.dataSource = ds; } @Override public long getNextLongValue( String sequenceName ) { return getNextKey( sequenceName ); } @Override public int getNextIntValue( String sequenceName ) { return return (int)getNextKey();; } @Override public String getNextStringValue( String sequenceName ) { return Long.toString(getNextKey()); } private String getSequenceQuery( String sequenceName ){ return "select nextval('" + sequenceName + "')"; } private long getNextKey( String sequenceName ) throws DataAccessException { Connection con = dataSource.getConnection(); Statement stmt = null; ResultSet rs = null; try { stmt = con.createStatement(); rs = stmt.executeQuery( getSequenceQuery(sequenceName) ); long l; if (rs.next()) { return rs.getLong(1); } }catch (SQLException ex){ }finally{ rs.close(); stmt.close(); con.close(); } } }
DELIMITER // CREATE FUNCTION 'nextval'( p_seq_nm varchar(50)) RETURNS bigint(20) begin declare nLast_val int; set nLast_val = (select last_cached_val from mysql_seq_table where seq_nm = p_seq_nm); if nLast_val is null then set nLast_val = 0; insert into mysql_seq_table (seq_nm,seq_val) values (p_seq_nm,nLast_Val); else set nLast_val = nLast_val + 1; update mysql_seq_table set last_cached_val = nLast_val where seq_nm = p_seq_nm; end if; return nLast_val; end // DELIMITER ;
create table mysql_seq_table ( seq_nm varchar(50) not null, last_cached_val bigint not null ) engine=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; alter table seq2 add constraint mysql_seq_table primary key ( 'seq_nm' );
create table biz_table1 ( biz_column1 bigint not null, ... ) alter table SQ_BIZ_TABLE1 add constraint mysql_seq_table primary key ( 'biz_column1' );