我正在插入Oracle数据库,两个模式和两个表,我在Jboss 6.3.2中创建了两个XA数据源,具有相同的URL但不同的用户, 对于每次调用,我创建了新事务,发生的事情是在一段时间后我得到错误,没有连接可用。我猜连接没有发布。我没有春天的经验,所以如果我的实施是错误的,我需要一个建议。
异常:
java.sql.SQLException: javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:/jdbc/tivibu_stb
at org.jboss.jca.adapters.jdbc.WrapperDataSource.getConnection(WrapperDataSource.java:151)
接口:
@RequestMapping
@Transactional
public interface RRStatisticsService {
@Cache(CacheType.NO_CACHE)
@AuthRequired(AuthType.USER)
@Transactional(propagation = Propagation.REQUIRES_NEW)
@RequestMapping(value = "/private/rr/sendChannelEvents.ajax", method = RequestMethod.POST)
public @ResponseBody void sendChannelEvents(@Valid @RequestBody ChannelRatingEvents events,
@SubscriberId String subscriberId, @UserId String userId, @DeviceId String deviceId) throws PortalException;
@Cache(CacheType.NO_CACHE)
@AuthRequired(AuthType.USER)
@Transactional(propagation = Propagation.REQUIRES_NEW)
@RequestMapping(value = "/private/rr/sendVodEvents.ajax", method = RequestMethod.POST)
public @ResponseBody void sendVodEvents(@Valid @RequestBody VodRatingEvents events,
@SubscriberId String subscriberId, @UserId String userId, @DeviceId String deviceId) throws PortalException;
}
豆:
@Controller
public class RRBean implements RRStatisticsService {
@Override
public void sendChannelEvents(ChannelRatingEvents events, String subscriberId, String userId, String deviceId)
throws PortalException {
saveChannelRatingEvents(events, subscriberId, userId, deviceId);
}
@Override
public void sendVodEvents(VodRatingEvents events, String subscriberId, String userId, String deviceId)
throws PortalException {
saveVodRatingEvents(events, subscriberId, userId, deviceId);
}
private void saveChannelRatingEvents(ChannelRatingEvents events, String subscriberId, String userId,
String deviceId) throws SomeException {
try {
JdbcTemplate template = getJdbcTemplate(userId, deviceId, events.getClientType());
insertChannelRating(events, subscriberId, userId, template);
} catch (Exception e) {
//Handle exception
}
}
private void insertChannelRating(ChannelRatingEvents events, String subscriberId, String userId, JdbcTemplate template){
template.batchUpdate(SQL_CHANNEL_RATING, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
ChannelRatingEvent event = rrevents.get(i);
ps.setString(1, event.getChannelViewID());
ps.setString(2, event.getChannelName());
ps.setInt(3, event.getChannelID());
ps.setInt(4, event.getStreamFlag());
ps.setInt(5, events.getClientType());
ps.setDate(6, event.Date());
ps.setString(7, userId);
ps.setString(8, subscriberId);
ps.setString(9, "0");
ps.setDate(10, event.Date());
}
@Override
public int getBatchSize() {
return rrevents.size();
}
});
}
private void saveVodRatingEvents(VodRatingEvents events, String subscriberId, String userId, String deviceId)
throws SomeException {
try {
JdbcTemplate template = getJdbcTemplate(userId, deviceId, events.getClientType());
insertVodRating(events, subscriberId, userId, template);
} catch (Exception e) {
//HANDLE EXCEPTION
}
}
private void insertVodRating(VodRatingEvents events, String subscriberId, String userId, JdbcTemplate template){
template.batchUpdate(SQL_VOD_RATING, new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
VodRatingEvent event = rrevents.get(i);
ps.setString(1, event.getVodViewID());
ps.setString(2, event.getVodName());
ps.setString(3, event.getAssetID());
ps.setInt(4, event.getVodType());
ps.setInt(5, event.getVodSegment());
ps.setInt(6, clientType);
ps.setDate(7, event.getDate());
ps.setString(8, userId);
ps.setString(9, subscriberId);
ps.setString(10, "0");
ps.setDate(11, event.getDate());
}
@Override
public int getBatchSize() {
return rrevents.size();
}
});
}
private JdbcTemplate getJdbcTemplate(String userId, String deviceId, Integer clientType) {
DataSource dataSource = null;
JndiTemplate jndi = new JndiTemplate();
String dataSourceJndi;
if (clientType.intValue() == 0) {
dataSourceJndi = getUserPreferences(userId, deviceId).get(STB_DS_PREF_KEY);
}
} else {
dataSourceJndi = getUserPreferences(userId, deviceId).get(OTT_DS_PREF_KEY);
}
}
try {
dataSource = (DataSource) jndi.lookup(dataSourceJndi);
} catch (NamingException e) {
logger.error("NamingException for " + dataSourceJndi, e);
return null;
}
return new JdbcTemplate(dataSource);
}
}
stbportal-servlet.xml中
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- Component auto-scanning -->
<context:component-scan base-package="com.ericsson.iptv.portal.avalanche.tt.rr.iap" />
数据源定义:
<xa-datasource jndi-name="java:/jdbc/tivibu_stb" pool-name="jdbc_tivibu_stb" enabled="true" use-ccm="false">
<xa-datasource-property name="User">
USER2
</xa-datasource-property>
<xa-datasource-property name="Password">
PWD2
</xa-datasource-property>
<xa-datasource-property name="URL">
jdbc:oracle:thin:@hostip2:1521:TTEST2
</xa-datasource-property>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<driver>ojdbc</driver>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<xa-pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
<use-strict-min>false</use-strict-min>
<is-same-rm-override>false</is-same-rm-override>
<interleaving>false</interleaving>
<no-tx-separate-pools>true</no-tx-separate-pools>
<pad-xid>false</pad-xid>
<wrap-xa-resource>false</wrap-xa-resource>
</xa-pool>
<validation>
<validate-on-match>false</validate-on-match>
<background-validation>false</background-validation>
</validation>
<timeout>
<set-tx-query-timeout>false</set-tx-query-timeout>
<blocking-timeout-millis>0</blocking-timeout-millis>
<idle-timeout-minutes>1</idle-timeout-minutes>
<query-timeout>0</query-timeout>
<use-try-lock>0</use-try-lock>
<allocation-retry>0</allocation-retry>
<allocation-retry-wait-millis>0</allocation-retry-wait-millis>
<xa-resource-timeout>0</xa-resource-timeout>
</timeout>
<statement>
<share-prepared-statements>false</share-prepared-statements>
</statement>
</xa-datasource>