Problema com driver JTDS!

11 respostas
L

Boa tarde a todos.

Estou utilizando o driver jtds 1.2.5 para se conectar ao banco de dados SQL Server 2008 Express.

O mesmo conecta normalmente e executa tudo o que preciso.

O problema é o seguinte, estou desenvolvendo um programa que vai retornar do banco uma quantidade de registro muito grande, por volta de 20000 registros!

Fiz um for que vai percorrer todos esses retornos do banco e adicionará o conteudo dos mesmo a uma jTable.

Porem quando chega por volta do registro 1900 ele apresenta o seguinte erro:

java.sql.sqlexception: login failed for user “root”.

O que pode estar causando esse erro? Uma vez que a senha esta correta e tanto é que retornou os 1899 registros anteriores?

Eu fiz um teste e o exception esta ocorrendo na minha classe de conexão:

public class Conexao {

    private static String DRIVER = "jdbc:jtds:sqlserver://";
    private static String SERVERURL = "extconextst.dyndns.org:1433/";
    private static String DATABASE = "TOTVS_PRD";
    private static String USERNAME = "ROOT";
    private static String PASSWORD = "SENHA";

    public static void main(String[] args) {
        getConexao();
    }

    public static Connection getConexao() {
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            System.out.println("Banco - conectado ao banco de dados MSSQL.");
            return DriverManager.getConnection(DRIVER + SERVERURL + DATABASE, USERNAME, PASSWORD);
        } catch (ClassNotFoundException | SQLException ex) {
            JOptionPane.showMessageDialog(null, "Erro ao executar a solicitação:\n\n" + ex, "Sistema Custo", JOptionPane.ERROR_MESSAGE);
        }
        return null;
    }
}

Não existe uma forma de deixar essa conexão aberta durante a execução do meu programa? Por que eu executo esse metodo para cada um dos registros dessa tabela (+ ou - 20000).

Minha logica deve esta meio defazada! Seria o caso de usar o Hibernate?

Fico no aguardo e desde já agradeço.

11 Respostas

E

Você sabe usar o SQL Server Enterprise Manager? Se ele estiver dizendo que há 1900 conexões abertas no banco de dados, deve ser seu programa que não fechou as conexões.

W

Poder ser problema de timeout. Por ser muitos registros o a conexão fica muito tempo aberta, ai por proteção o SGDB fecha essa conexão.

Veja um exemplo de como configurar o timeout:

<local-tx-datasource>     
	<jndi-name>MyDS</jndi-name>     
	<connection-url>jdbc:jtds:sqlserver://192.168.35.235:1433/MyDb</connection-url>
	<driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>     
	<user-name>user1</user-name>     
	<password>pwd</password>     
	<min-pool-size>10</min-pool-size>     
	<max-pool-size>25</max-pool-size>     
	<blocking-timeout-millis>60000</blocking-timeout-millis>     
	<idle-timeout-minutes>1</idle-timeout-minutes>     
	<check-valid-connection-sql>select getdate()</check-valid-connection-sql>   
</local-tx-datasource>
W
L

Entao amigo, eu até tenho aqui o SQL Manager! Onde eu vejo essa informação de conexões abertas? Pelo que voce viu no meu código de conexão esta correto?

Na minha classe DAO, eu fui verificar e nao tinha o bentido ResultSet close() nem o PreparedStatement close()… eu esqueci!
Coloquei os dois e mesmo assim continuou dando erro.

Ai coloquei a minha Conexao.close() e mesmo assim continuou com o erro.

O que mais posso mudar?

Sera que por algum motivo no ato da execução… esse arquivo de conexão pode mudar?

Impossivel né?

Fico no aguardo!

L

Entao mais ondeu eu edito esse arquivo? Nao estou usando Hibernate… eu acho que pode ser esse timeout apesar do que quando é exception de timeout ele apresenta a mensagem adequada…

Mais em todo caso vale tentar… onde eu mudo isso?

Valeu!

L

Só complementando, tambem aparece esse exception em outro metodo:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at pkg.dao.Banco.getQuantidade(Banco.java:83)
	at pkg.forms.JFPrincipal.daoGetQuantidade(JFPrincipal.java:504)
	at pkg.forms.JFPrincipal.jBAtualizarQtdActionPerformed(JFPrincipal.java:410)
	at pkg.forms.JFPrincipal.access$300(JFPrincipal.java:22)
	at pkg.forms.JFPrincipal$4.actionPerformed(JFPrincipal.java:142)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
	at java.awt.Component.processMouseEvent(Component.java:6505)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6270)
	at java.awt.Container.processEvent(Container.java:2229)
	at java.awt.Component.dispatchEventImpl(Component.java:4861)
	at java.awt.Container.dispatchEventImpl(Container.java:2287)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
	at java.awt.Container.dispatchEventImpl(Container.java:2273)
	at java.awt.Window.dispatchEventImpl(Window.java:2719)
	at java.awt.Component.dispatchEvent(Component.java:4687)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:703)
	at java.awt.EventQueue.access$000(EventQueue.java:102)
	at java.awt.EventQueue$3.run(EventQueue.java:662)
	at java.awt.EventQueue$3.run(EventQueue.java:660)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
	at java.awt.EventQueue$4.run(EventQueue.java:676)
	at java.awt.EventQueue$4.run(EventQueue.java:674)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:673)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:244)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:163)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:147)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:139)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:97)

Fico no aguardo!

E

Se você ficar repetidamente abrindo e fechando a conexão para cada registro para essa consulta, vai ter um problema relativo a sockets - o socket não consegue abrir e fechar em velocidade muito grande, e acabam ficando muitos sockets semi-abertos, que podem acabar impedindo as conexões à base.

Use um pool de conexões, que deixa já a conexão aberta e pronta para ser usada; alguns deles também ficam fazendo periodicamente consultas vazias, para manter a conexão aberta mesmo quando você está com seu sistema inativo.

L

entanglement:
Se você ficar repetidamente abrindo e fechando a conexão para cada registro para essa consulta, vai ter um problema relativo a sockets - o socket não consegue abrir e fechar em velocidade muito grande, e acabam ficando muitos sockets semi-abertos, que podem acabar impedindo as conexões à base.

Use um pool de conexões, que deixa já a conexão aberta e pronta para ser usada; alguns deles também ficam fazendo periodicamente consultas vazias, para manter a conexão aberta mesmo quando você está com seu sistema inativo.

Voce nao tem um exemplo de como implementar o pool pra minha conexão?

Valeu!

E

Procure por “connection pool”. Não tenho um exemplo pronto aqui, até porque não sei se sua aplicação é Desktop ou Web.

L

Beleza eu vou dar uma olhada… acho que deve ser a solução entao por que já fiz de tudo aki e nao consigo identificar o erro! Ah, minha aplicação é desktop!

W

Você pode passar os parâmetros na String de conexão. Veja:

jdbc:jtds:sqlserver://192.168.35.235:1433/MyDb;user=user1;password=pwd;appName=MyApp;loginTimeout=15;socketTimeout=120
Criado 6 de julho de 2012
Ultima resposta 6 de jul. de 2012
Respostas 11
Participantes 3