다음은 sequence incrementer를 지원하지 않는 Phoenix 을 사용하는 경우의 예시입니다.
<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="PhoenixSequence">
<constructor-arg><ref local="dataSource"/></constructor-arg>
</bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.apache.phoenix.jdbc.PhoenixDriver"/>
<property name="url" value="jdbc:phoenix:0.0.0.0:2181"/>
</bean>
</beans>
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.DataSource;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.jdbc.support.JdbcUtils;
public class PhoenixSequence implements GlueSequence
{
private DataSource dataSource;
public GluePhoenixSequence( DataSource ds )
{
this.dataSource = ds;
}
public DataSource getDataSource()
{
return this.dataSource;
}
@Override
public long getNextLongValue( String sequenceName )
{
return getNextKey( sequenceName );
}
@Override
public int getNextIntValue( String sequenceName )
{
return (int) getNextKey( sequenceName );
}
@Override
public String getNextStringValue( String sequenceName )
{
return Long.toString( getNextKey( sequenceName ) );
}
private String getSequenceQuery( String sequenceName )
{
return "select NEXT VALUE FOR " + sequenceName + " from SYSTEM.\"SEQUENCE\" limit 1";
}
private long getNextKey( String sequenceName ) throws DataAccessException
{
Connection con = DataSourceUtils.getConnection( getDataSource() );
Statement stmt = null;
ResultSet rs = null;
try
{
stmt = con.createStatement();
DataSourceUtils.applyTransactionTimeout( stmt, getDataSource() );
rs = stmt.executeQuery( this.getSequenceQuery( sequenceName ) );
if ( rs.next() )
{
return rs.getLong( 1 );
} else
{
throw new DataAccessResourceFailureException( "Sequence query did not return a result" );
}
} catch ( SQLException ex )
{
throw new DataAccessResourceFailureException( "Could not obtain sequence value", ex );
} finally
{
JdbcUtils.closeResultSet( rs );
JdbcUtils.closeStatement( stmt );
DataSourceUtils.releaseConnection( con, getDataSource() );
}
}
}