sql server - Antal stikkontakter til rådighed for en JDBC-forbindelse i Windows 2003

Indlæg af Hanne Mølgaard Plasc

Problem



Mit team opbyggede en Windows-tjeneste i Java, der forbinder til en SQL Server 2005 i en Windows 2003 Server, ved hjælp af ren JDBC (ingen forbindelse pooling) med JTDS-driveren.


Efter et stykke tid starter metoden, der åbner forbindelserne til databasen, undtagelser med følgende stakspor:


    java.net.BindException: Address already in use: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl .java:305)
at java.net.PlainSocketImpl.connectToAddress(PlainSoc ketImpl.java:171)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.j ava:158)
at java.net.Socket.connect(Socket.java:452)
at java.net.Socket.connect(Socket.java:402)
at java.net.Socket.<init>(Socket.java:309)
at java.net.Socket.<init>(Socket.java:124) 


Selvom programmørerne var forsigtige med at lukke forbindelser, da de var færdige, går det ikke rigtigt.


For øjeblikket løste vi problemet med at skifte til protokollen Named Pipes (da alle er hostet i samme maskine), men det er en midlertidig løsning.


Jeg har googled for problemet, og det ser ud til at vi burde bruge en forbindelse til at samle biblioteket sådan c3p0. Er det den eneste løsning på problemet?


Kan jeg forsøge at øge stikgrænsen i Windows 2003?

Bedste reference


Er du åbne/lukke forbindelser med en meget hurtig hastighed? Når en TCP-forbindelse er lukket, hænger de et øjeblik i TIME\_WAIT-tilstanden. På Windows er standardtiden de 240 sekunder. Det lyder som om du måske har et par tcp-forbindelser i TIME\_WAIT-tilstanden. [2]


Du kan tjekke dette ved at køre netstat. Hvis du har et stort antal tcp-forbindelser til databaseserveren i tilstanden TIME\_WAIT, vil en forbindelsespulje rette dit problem.


Du kan forsøge at hæve sokkelgrænsen og/eller sænke den tid, en forbindelse forbliver i tilstanden TIME\_WAIT. Men dette vil ændre opførslen af ​​alle tcp-forbindelser. Så brug en forbindelse pool :) Vi bruger dbcp som vores forbindelse pool løsning i Java. [3]

Andre referencer 1


Det ser virkelig ud som om du ikke har forbindelse til hinanden. Det eller du forsøger at genbruge forbindelsen forkert ...


Det anbefales kraftigt at bruge en forbindelsespulje af forskellige præstationsmæssige grunde. For eksempel behøver du ikke at oprette forbindelse hver gang, hvilket er meget dyrt. Genbrug af forbindelser gør en verden af ​​forskel.


For det andet vil du virkelig skabe din egen pooling mekanisme? Det er ikke så simpelt som det ser ud, der er masser af idiosynkratiske threading-problemer. Det er meget nemmere at bare bruge et eksisterende bibliotek, der står imod tidens test.