quarta-feira, 25 de março de 2009

Código java compilado?

Sempre pensei na facilidade de decompilação de um arquivo jar criado em java, buscando uma solução pra isso acabei encontrado o gcj que compila um código java criando um executável sem chance de ser decompilado (ou pelo menos muuuuuuito mais difícil do que o jar), veja um exemplo:

HelloWorld.java:

public class HelloWorld {
public static void main(String [] args) {
System.out.println("Teste com java compilado para codigo nativo$
}
}


Basta compilar assim (claro que o gcj tem que estar previamente instalado):
gcj --main=HelloWorld -o HelloWorld HelloWorld.java


Com isso será criado o arquivo HelloWorld com permissão de execução (no caso do Linux) e para executá-lo:
./HelloWorld

Seria interessante poder utilizar diretamente no NetBeans, pois geralmente um projeto em java não se limita a uma única classe e penso eu que se estiver dentro do NetBeans ele mesmo vai criar as condições necessárias para utilizar o gcj sem muito esforço, então encontrei a página http://wiki.netbeans.org/FaqGcj mas ainda não deu tempo de testar pra ver se realmente funciona.

T+

sexta-feira, 6 de março de 2009

Broken pipe: A SOLUÇÃO CORRETA

Não vou negar... quebrei muito a cabeça com esse problema em um sistema que recebe conexões via socket, o problema se dava quando ficava muito tempo se receber conexões, eis que acabava gerando o erro "Broken pipe"... e nada mais funcionava, a minha primeira tentativa (com sucesso) mas não muito elegante, pois poderia acarretar em outros problemas está no post:
http://netbeando.blogspot.com/2008/06/broken-pipe-conexo-com-socket-no-banco.html

Bom, agora apresento a solução mais elegante...

1) Para criar um pool de conexões com o banco, inclua no seu projeto a biblioteca c3p0 e faça a conexão dessa forma:

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/nome_base_dados");
cpds.setUser("usuario_banco");
cpds.setPassword("senha_usuario_banco");
cpds.setMinPoolSize(5);
cpds.setAcquireIncrement(5);
cpds.setMaxPoolSize(20);
cpds.setIdleConnectionTestPeriod(60);
cpds.setMaxStatements(0);
cpds.setInitialPoolSize(3);
cpds.setPreferredTestQuery("select 1");
cpds.setCheckoutTimeout(1000);

con = cpds.getConnection();

Essas foram as configurações que eu utilizei para testes no meu tipo de sistema, pesquise sobre o c3p0 e veja quais serão as que se adaptam melhor ao seu problema.

2) Por último, mas não menos importante, sete a propriedade do socket (server) que recebe as conexões do cliente:

private static Socket conexao;
.
.
.
public static void main(String[] args) {
.
.
.
conexao.setKeepAlive(true);
.
.
.
}


Fazendo esses 2 itens resolveu completamente o problema.

Espero que ajude a você também...