Connection poolling com JBoss

7 respostas
C

Gostaria de saber como , no JBoss , publicar um , ou alguns, pools de conexões com banco de dados.
O fato é vou precisar acessar este pool de EJB’s BMP e Servlets e gostaria de acessá-los via JNDI.
Sei que alguns appServers tem este tipo de serviço e gostaria de usá-lo no JBoss.

Claudio Gualberto
SCJP 1.4

7 Respostas

wbsouza

No diretório $JBOSS_HOME/docs/examples/jca tem um monte de exemplos de arquivos pré configurados para diversos bancos de dados. Basta copiar para outro arquivo (desde que esteja no formato ???-service.xml), e copiá-lo para o diretório $JBOSS_HOME/server/default/deploy, e agora já é possível pegar um DataSource usando JNDI

[]s, Welington B. Souza

C

Blz, eu peguei o exemplo para Oracle, fiz as alterações necessárias e rodou blz.
Um problema que encontrei é que, mesmo definindo o nome de usuário e senha no XML, no momento de pegar uma conexão eu tive que mandar usuário e senha, pois sem isso ele lança uma SQLException dizendo que os parametros são inválidos.
Como fazer para ele não pedir usuário e senha no ato do DataSource.getConnection() ?, pois assim os objetos clientes seriam menos aclopados ao DataSource.
Obrigado pela ajuda.

Claudio Gualberto
SCJP 1.4

wbsouza

segue o codigo abaixo que faz o que vc quer

package strutsdemo.bean;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.LinkedList;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class AdminUsers {
    
    
    protected static DataSource dataSource;
    
    public AdminUsers() throws Exception {
        if (dataSource == null) {
            try {
                InitialContext ic = new InitialContext();
                dataSource = (DataSource) ic.lookup("java:OracleDS");
            } catch (NamingException ex) {
                System.out.println(ex.getMessage());
                throw ex;
            }
        }
    }
    
    protected Connection getConnection() throws SQLException {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        }
        catch (SQLException e) {
            throw e;
        }
        return conn;
    }
    

    protected void closeConnection(
        Connection conn,
        PreparedStatement stmt,
        ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
            }
        }
        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
            }
        }
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
            }
        }
    }
    
    public LinkedList getUserList() throws SQLException {
        Connection conn = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;
        LinkedList users  = new LinkedList();
        try {
            conn = getConnection();
            stmt = conn.prepareStatement("select * from usuario");
            rs = stmt.executeQuery();
            while (rs.next()) {
                UserData user = new UserData();
                user.setIdUsuario(rs.getInt("id_usuario"));
                user.setNome(rs.getString("nome"));
                user.setLogin(rs.getString("login"));
                user.setSenha(rs.getString("senha"));
                user.setSexo(rs.getString("sexo"));
                user.setAtivo(rs.getBoolean("ativo"));
                user.setFaixaIdade(rs.getInt("faixa_idade"));
                users.add(user);
            }
        }
        catch (SQLException e) {
            throw e;
        }
        finally {
            closeConnection(conn, stmt, rs);
        }
        return users;
    }
}

[]s, Welington B. Souza

C

Ok, o uso do objeto de conexão não é problema, o problema é como configurar o oracle-service.xml para que quando eu for usar um getConnection() no DataSource eu não precisar mandar usuário e senha, pois assim vou ter que encher os deployment descriptors de meus EJBs com essa informação, sendo que eu poderia te-la somente na definição do serviço.
Obrigado pela ajuda.

Claudio Gualberto
SCJP 1.4

wbsouza

Pegando o arquivo que fica em $JBOSS_HOME/docs/examples/jca e setando as suas propriedades (é necessário informar o usuário e a senha dentro deste arquivo). Veja no codigo java que passei, não estou informando usuário e senha. O JBoss pega do arquivo oracle-service.xml

segue abaixo o conteudo do arquivo:

<?xml version="1.0" encoding="UTF-8"?>
<server>
  <mbean code="org.jboss.resource.connectionmanager.LocalTxConnectionManager" name="jboss.jca:service=LocalTxCM,name=OracleDS">
    <depends optional-attribute-name="ManagedConnectionFactoryName">
      <mbean code="org.jboss.resource.connectionmanager.RARDeployment" name="jboss.jca:service=LocalTxDS,name=OracleDS">
        <attribute name="JndiName">OracleDS</attribute>
        <attribute name="ManagedConnectionFactoryProperties">
          <properties>
            <config-property name="ConnectionURL" type="java.lang.String">jdbc:oracle:thin:@localhost:1521:ERP</config-property>
            <config-property name="DriverClass" type="java.lang.String">oracle.jdbc.driver.OracleDriver</config-property>
            <config-property name="UserName" type="java.lang.String">finance_user</config-property>
            <config-property name="Password" type="java.lang.String">1234</config-property>
          </properties>
        </attribute>
        <depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=JBoss LocalTransaction JDBC Wrapper</depends>
      </mbean>
    </depends>

    <depends optional-attribute-name="ManagedConnectionPool">
      <mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool" name="jboss.jca:service=LocalTxPool,name=OracleDS">
        <attribute name="MinSize">0</attribute>
        <attribute name="MaxSize">50</attribute>
        <attribute name="BlockingTimeoutMillis">5000</attribute>
        <attribute name="IdleTimeoutMinutes">15</attribute>
        <attribute name="Criteria">ByContainer</attribute>
      </mbean>
    </depends>
    <depends optional-attribute-name="CachedConnectionManager">jboss.jca:service=CachedConnectionManager</depends>
   
    <depends optional-attribute-name="JaasSecurityManagerService">jboss.security:service=JaasSecurityManager</depends>

    <attribute name="TransactionManager">java:/TransactionManager</attribute>
    <depends>jboss.jca:service=RARDeployer</depends>

  </mbean>
</server>

[]s, Welington B. Souza

C

Agora funcionou !!
O problema é que eu estava definindo os config-property e não estava definindo o nome da tag, assim :

<config-property type=“java.lang.String”>MyUser</config-property>
<config-property type=“java.lang.String”>mypass</config-property>

quando deveria ser :

<config-property name=“Username” type=“java.lang.String”>MyUser</config-property>
<config-property name"Password" type=“java.lang.String”>mypass</config-property>

A dúvida agora é a seguinte :

 Eu tenho vários EJB´s no mesmo ejb-jar.jar , e gostaria de definir um parametro ao qual todos eles tenham acesso, atravéz do BeanContext ou sei-la como. 
 Como definir isso uma unica vez no no ejb-jar.xml e como pegar essas informações dentro do código dos Beans.
 Desculpe por estas perguntas básicas, acontece que sou novato em EJB´s e obrigado pelo ajuda.

Claudio Gualberto
SCJP 1.4

wbsouza

Não tenho resposta para esta pergunta. Talvez vc consiga encontrar algo no forum, onde foram postados alguns links a respeito do assunto.

http://www.guj.com.br/forum/viewtopic.php?t=1662&highlight=documenta��o+jboss
http://www.guj.com.br/forum/viewtopic.php?t=3452&highlight=

[]s, Welington B. Souza

Criado 6 de julho de 2003
Ultima resposta 9 de jul. de 2003
Respostas 7
Participantes 2