java - refrescar - La fuente de datos de Jboss se recupera después de reiniciar la base de datos
metodo reiniciar java (3)
Conexiones cerradas aún en el grupo de conexiones, ¿por qué?
servlet-
public class Index extends HttpServlet {
TimeZoneService timeZoneService;
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException {
WebApplicationContext ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
timeZoneService = (TimeZoneService) ctx.getBean("timeZoneService");
timeZoneService.loadAllTimeZones();
System.out.println("Done");
}
}
public interface TimeZoneService {
void loadAllTimeZones();
}
public class TimeZoneServiceImpl implements TimeZoneService {
private TimeZoneDao tzDao;
private Map<Long, String> tzOid2JavaName = new HashMap<Long, String>();
public void loadAllTimeZones() {
List<TimeZone> timeZones = tzDao.findAllTimeZones();
for (TimeZone tz : timeZones) {
tzOid2JavaName.put(tz.getOid(), tz.getJavaName());
}
}
public void setTzDao(TimeZoneDao tzDao) {
this.tzDao = tzDao;
}
}
public interface TimeZoneDao {
List<TimeZone> findAllTimeZones() throws DataAccessException;
}
public class TimeZoneDaoImpl extends JdbcDaoSupport implements TimeZoneDao {
public List<TimeZone> findAllTimeZones() throws DataAccessException
{
StringBuffer sql = new StringBuffer();
sql.append("SELECT TZ.OID, TZ.JAVA_NAME FROM TIME_ZONE TZ");
List<TimeZone> timeZones = getJdbcTemplate().query(sql.toString(), new RowMapper() {
public Object mapRow(ResultSet rs, int i) throws SQLException {
TimeZone tz = new TimeZone();
tz.setOid(rs.getLong("OID"));
tz.setJavaName(rs.getString("JAVA_NAME"));
return tz;
}
});
return timeZones;
}
}
public class TimeZone {
private Long oid;
private String javaName;
public Long getOid() {
return this.oid;
}
public void setOid(Long oid) {
this.oid = oid;
}
public String getJavaName() {
return this.javaName;
}
public void setJavaName(String javaName) {
this.javaName = javaName;
}
}
spring-config.xml
<beans>
<jee:jndi-lookup id="dataSource" jndi-name="java:/OracleDS"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="timeZoneDao" class="dao.impl.TimeZoneDaoImpl">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="timeZoneService" class="logic.impl.TimeZoneServiceImpl">
<property name="tzDao" ref="timeZoneDao"/>
</bean>
</beans>
web.xml
<web-app>
<display-name>Spring</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
WEB-INF/spring-config.xml,classpath*:/META-INF/spring-config.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>index</servlet-name>
<display-name>Index page</display-name>
<description>Landing page</description>
<servlet-class>servlet.Index</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>index</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>
<!-- Session Timeout (in minutes) -->
<session-config>
<session-timeout>60</session-timeout>
</session-config>
</web-app>
mysql-ds.xml
<datasources>
<local-tx-datasource>
<jndi-name>OracleDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/spring</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>spring_test</user-name>
<password>spring_test13</password>
<min-pool-size>1</min-pool-size>
<max-pool-size>5</max-pool-size>
<idle-timeout-minutes>2</idle-timeout-minutes>
</local-tx-datasource>
</datasources>
Este es un problema común que surge al usar un grupo de conexiones. Cuando la aplicación toma prestada una conexión del grupo, ¿debería el grupo "probar" la conexión para asegurarse de que sigue siendo válida o debería dejarla en manos de la aplicación?
Si el grupo prueba la conexión, esto inevitablemente implica enviar algo a través de la conexión al servidor de la base de datos (generalmente un SELECCIONAMIENTO básico de algún tipo). En los sistemas de alto tráfico, esto es enormemente dispendioso y puede agregar un estrés considerable al servidor de la base de datos.
Sin embargo, en sitios de poco tráfico, donde su base de datos puede manejar la carga adicional, puede configurar su fuente de datos para que JBoss valide la conexión antes de pasarla a su aplicación. Si la conexión está muerta, JBoss la eliminará del grupo y obtendrá una nueva, por lo que sobrevivirá a un reinicio de la base de datos.
Cualquiera, agregue esto a su archivo mysql-ds.xml
:
<check-valid-connection-sql>select 1 from mytable</check-valid-connection-sql>
Debe elegir la consulta usted mismo, asegúrese de que no sea costosa, ya que se ejecutará mucho .
Consulte la wiki de documentación de JBoss para ver cómo modificar estos archivos de fuentes de datos.
De acuerdo. Espero que lo siguiente sea útil para alguien :-)
Hay una configuración de configuración de fuente de datos - exception-sorter-class-name
Según Jboss, esto se utiliza para a class that looks at vendor specific messages to determine whether sql errors are fatal and thus the connection should be destroyed. If none specified, no errors will be treated as fatal.
a class that looks at vendor specific messages to determine whether sql errors are fatal and thus the connection should be destroyed. If none specified, no errors will be treated as fatal.
Si usa la base de datos Oracle, esta configuración se establece en org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter
. Esta clase tiene todos los códigos de error que deben tratarse como fatales y, por lo tanto, es necesario destruir la conexión.
En Jboss 4, los códigos de error 17002 (restablecimiento de conexión) && 17008 (conexión cerrada) no están incluidos. Se agregan en Jboss 5. Por lo tanto, si está utilizando Jboss 4 y se pregunta por qué las conexiones no se están recuperando, intente agregar los códigos que faltan.
Aquí está la configuración de validación de conexión con Oracle DB para jboss 7.1+ :
<validation>
<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.vendor.OracleValidConnectionChecker"/>
<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>
<stale-connection-checker class-name="org.jboss.jca.adapters.jdbc.vendor.OracleStaleConnectionChecker"/>
<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleExceptionSorter"/>
</validation>
Ahora Jboss validará todas tus conexiones.