Falae pessoal!
Tenho um pool de conexões configurado e funcionando no Tomcat 5.0.28. Essas conexões são criadas e guardadas em JNDI, certo?
Tem como eu criar uma aplicação Swing para pegar uma conexão dessas? Se tiver, como eu faço isso?
Valeu!
Falae pessoal!
Tenho um pool de conexões configurado e funcionando no Tomcat 5.0.28. Essas conexões são criadas e guardadas em JNDI, certo?
Tem como eu criar uma aplicação Swing para pegar uma conexão dessas? Se tiver, como eu faço isso?
Valeu!
no tomcat acho que não da p/ fazer, pq ele é so um container jsp/servlet, mas não tenho certeza.
vc vai ter que usar o jboss p/ isso.
[]'s
O quer dizer essa mensagem?
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
Olá
João, desta vez você se enganou. No Tomcat é possível configurar pool de conexões.
Luiz, é perfeitamente possível vc criar um pool de conexões para uma aplicação swing usando JNDI com tomcat. Mas para que uma aplicação swing que normalmente roda no cliente precisaria pegar uma conexão? Será que vc acha uma boa o cliente acessar diretamente a base de dados? Para mim isto soa meio como coisa do milênio passado.
Como recebeu esta mensagem de erro?
[]s
Luca
Luiz, é perfeitamente possível vc criar um pool de conexões para uma aplicação swing usando JNDI com tomcat. Mas para que uma aplicação swing que normalmente roda no cliente precisaria pegar uma conexão? Será que vc acha uma boa o cliente acessar diretamente a base de dados? Para mim isto soa meio como coisa do milênio passado.
Na verdade não vai rodar no cliente. Estou fazendo uma aplicação de gerenciamento de uma base de dados. Acontece q ela terá um processo q irá gerar alguns scripts, e esse processo é independente da Web. A base de dados já existe e gostaria de partir direto para esse processo para adiantar o trabalho. Esse processo irá acessar a base de dados e gerar esses scripts. Gostaria de poder utilizar o pool que já existe carregado no tomcat para pegar uma conexão.
Como recebeu esta mensagem de erro?
Eu fiz uma classe UtilBDConnection q pega conexões por DataSource. A String myDS é meu DataSource "java:comp/env/jdbc/CMAdminDS".
public static Connection getDataSourceConnection( String myDS ) {
Connection connection = null;
try {
Context context = new InitialContext();
if( context == null ) {
throw new Exception( "Boom!! - No Context!" );
}
DataSource dataSource = (DataSource)context.lookup( myDS );
if( dataSource != null ) {
connection = dataSource.getConnection();
}
} catch( Exception e ) {
e.printStackTrace();
}
return connection;
}
Então eu fiz uma classe main q tenta pegar essa Connection:
public static void main(String[] args) {
Connection connection = UtilBDConnection.getDataSourceConnection("java:comp/env/jdbc/CMAdminDS");
}
Mas está acusando esse erro, pq?
Olá
Falta inicializar a propriedade java.naming.factory.initial no jndi.properties. Veja: Specifying Environment Properties e Class InitialContext
[]s
Luca
Luca, fiz o seguinte:
Hashtable env = new Hashtable();
env.put("java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory");
Context context = new InitialContext(env);
Não criei meu arquivo jndi.properties, mas inicializei a propriedade “java.naming.factory.initial” com “com.sun.jndi.ldap.LdapCtxFactory”, e ele agora está acusando erro na conexão no servidor de serviços. Naverdade eu nem sei qual é esse servidor, pois eu não declarei nenhum… rsss
javax.naming.CommunicationException: localhost:389 [Root exception is java.net.ConnectException: Connection refused: connect]
No contexto da minha aplicação eu configurei esse DataSource:
<Resource
name="jdbc/CMAdminDS"
auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/CMAdminDS">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
.
.
.
</ResourceParams>
Eu tentei colocar no “java.naming.factory.initial” o valor “org.apache.commons.dbcp.BasicDataSourceFactory”, mas tb deu erro.
Enfim, valeu pela força, mas ainda continuo perdido.
Não teria como eu descobrir o nome do servidor q está servindo esse meu serviço?
Olá
Você poderia examinar com mais calma os textos sobre JNDI do tomcat e/ou tentar usar BeanFactory. Mas já vi que não entende quase nada de JNDI. Então é melhor que estude as classes Pool e Dbcp do jakarta-commons e instancie o seu pool usando elas.
Abaixo coloco um exemplo adaptado do livro Pro Jakarta Commons de Harshad Oak, Editora Apress (procure no google para baixar os fontes do cap. 6). Aí ele usa DriverManager e também DataSource: (veja PoolingDataSoutrce section)
import java.sql.*;
import javax.sql.*;
import org.apache.commons.dbcp.*;
import org.apache.commons.pool.*;
import org.apache.commons.pool.impl.*;
public class PoolingDriverDataSourceTrial {
public static void main(String[] args) {
Connection connUsingDriver = null;
Connection connUsingDataSource = null;
Statement stmt = null;
ResultSet rset = null;
try {
//Load MySQL Driver
Class.forName("com.mysql.jdbc.Driver");
//URI for test database
String uri = "jdbc:mysql://127.0.0.1:3306/test";
//PoolingDriver Section
registerPoolingDriver(uri);
connUsingDriver = DriverManager.getConnection(
"jdbc:apache:commons:dbcp:test");
System.out.println("[PoolingDriver] DB Name = " +
connUsingDriver.getMetaData().getDatabaseProductName());
//PoolingDataSource Section
DataSource dataSrc = getPoolingDataSource(uri);
connUsingDataSource = dataSrc.getConnection();
System.out.println("[PoolingDataSource] DB Name = " +
connUsingDataSource.getMetaData().getDatabaseProductName());
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (rset != null) {
rset.close();
}
if (stmt != null) {
stmt.close();
}
if (connUsingDriver != null) {
connUsingDriver.close();
}
if (connUsingDataSource != null) {
connUsingDataSource.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**Get a PoolingDataSource */
private static DataSource getPoolingDataSource(String uri)
throws Exception {
ObjectPool connPool = getConnPool(uri);
DataSource dataSrc = new PoolingDataSource(connPool);
return dataSrc;
}
/**Register a PoolingDriver */
private static void registerPoolingDriver(String uri)
throws Exception {
ObjectPool connPool = getConnPool(uri);
PoolingDriver driver = new PoolingDriver();
driver.registerPool("test", connPool);
}
/**Get Connection Pool */
private static ObjectPool getConnPool(String uri) throws Exception {
ObjectPool connPool = new GenericObjectPool(null);
ConnectionFactory connFactory = new DriverManagerConnectionFactory(uri,
null);
PoolableConnectionFactory poolableConnFactory = new PoolableConnectionFactory(connFactory,
connPool, null, null, false, true);
return connPool;
}
}
Ou procure por outros pools como o c3p0 e veja os exempos.
[]s
Luca
Realmente, preciso estudar bastante ainda.
Valeu pela força!