Package net.sourceforge.jtds.jdbc
Class SharedSocket
java.lang.Object
net.sourceforge.jtds.jdbc.SharedSocket
- Direct Known Subclasses:
SharedLocalNamedPipe,SharedNamedPipe
This class manages the physical connection to the SQL Server and
serialises its use amongst a number of virtual sockets.
This allows one physical connection to service a number of concurrent
statements.
Constraints and assumptions:
- Callers will not attempt to read from the server without issuing a request first.
- The end of a server reply can be identified as byte 2 of the header is non zero.
- This code will discard unread server data if a new request is issued. Currently the higher levels of the driver attempt to do this but may be we can just rely on this code instead.
- A cancel can be issued by a caller only if the server is currently sending data for the caller otherwise the cancel is ignored.
- Cancel packets on their own are returned as extra records appended to the previous packet so that the TdsCore module can process them.
- Author:
- Mike Hutchinson, Holger Rehn
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static classThis inner class contains the state information for the virtual socket. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final AtomicIntegerlast ID assigned to a VirtualSocket instanceprivate final ConcurrentMap<Integer, SharedSocket.VirtualSocket> Table of stream objects sharing this socket.private final FileThe directory to buffer data to.private final ObjectSynchronization monitor forcancelPendingandresponseOwner.private booleanA cancel packet is pending.private CharsetInfoThe character set to use for converting strings to/from bytes.private final byte[]Buffer for TDS_DONE packetsprivate intHow much of the doneBuffer has been filled with data, invalid input: '<'TDS_DONE_LEN IFF partial packet read.private static intTotal memory usage in all instances of the driver NB.private final byte[]Buffer for packet header.private StringThe server host name.private DataInputStreamInput stream for network socket.private intCurrent maximum input buffer size.private static intMax memory limit to use for buffers.private static intMinimum number of packets that will be cached in memory before the driver tries to write to disk even if memoryBudget has been exceeded.private DataOutputStreamOutput stream for network socket.private intCount of packets received.private static intPeak memory usage for debug purposes.private intThe server port number.private SharedSocket.VirtualSocketThe virtual socket of the object that is expecting a response from the server.private static booleanGlobal flag to indicate that security constraints mean that attempts to create work files will fail.protected final intThe servertype one of Driver.SQLSERVER or Driver.SYBASEprivate SocketThe shared network socket.private SocketThe shared SSL network socket;private static final intLength of a TDS_DONE token.private static final intTDS done token.private static final intLength of TDS packet header.private intTds protocol version -
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedSharedSocket(File bufferDir, int tdsVersion, int serverType) (package private)SharedSocket(JtdsConnection connection) Construct aSharedSocketobject specifying host name and port. -
Method Summary
Modifier and TypeMethodDescription(package private) booleancancel(SharedSocket.VirtualSocket vsock) Send a TDS cancel packet to the server.(package private) voidclose()Close the socket and release all resources.(package private) voidDeallocate a stream linked to this socket.private SocketcreateSocketForJDBC3(JtdsConnection connection) Creates aSocketconnection.private byte[]Read a cached packet from the in memory queue or from a disk based queue.(package private) voidDisable TLS encryption and switch back to raw TCP/IP socket.(package private) voidenableEncryption(String ssl) Enable TLS encryption by creating a TLS socket over the existing TCP/IP network socket.private voidenqueueInput(SharedSocket.VirtualSocket vsock, byte[] buffer) Save a packet buffer in a memory queue or to a disk queue if the global memory limit for the driver has been exceeded.protected voidfinalize()Ensure all resources are released.(package private) voidForce close the socket causing any pending reads/writes to fail.(package private) StringRetrieve the character set name used to translate byte arrays to or from Strings.(package private) CharsetInfoRetrieve the character set descriptor used to translate byte arrays to or from Strings.protected StringgetHost()Get the server host name.protected DataInputStreamgetIn()Getter forinfield.(package private) StringgetMAC()(package private) static intGet the global buffer memory limit for all instancs of this driver.(package private) static intGet the minimum number of memory cached packets.(package private) byte[]getNetPacket(SharedSocket.VirtualSocket vsock, byte[] buffer) Get a network packet.protected DataOutputStreamgetOut()Getter foroutfield.(package private) static intgetPktLen(byte[] buf) Convert two bytes (in network byte order) in a byte array into a Java short integer.protected intgetPort()Get the server port number.(package private) RequestStreamgetRequestStream(int bufferSize, int maxPrecision) Obtain an instance of a server request stream for this socket.(package private) ResponseStreamgetResponseStream(RequestStream requestStream, int bufferSize) Obtain an instance of a server response stream for this socket.(package private) intRetrieve the TDS version that is active on the connection supported by this socket.(package private) booleanGet the connected status of this socket.private byte[]readPacket(byte[] buffer) Read a physical TDS packet from the network.(package private) byte[]sendNetPacket(SharedSocket.VirtualSocket vsock, byte[] buffer) Send a network packet.(package private) voidsetCharsetInfo(CharsetInfo charsetInfo) Set the character set descriptor to be used to translate byte arrays to or from Strings.protected voidsetIn(DataInputStream in) Setter forinfield.protected voidsetKeepAlive(boolean keepAlive) Set the socket keep alive.(package private) static voidsetMemoryBudget(int memoryBudget) Set the global buffer memory limit for all instances of this driver.(package private) static voidsetMinMemPkts(int minMemPkts) Set the minimum number of packets to cache in memory before writing to disk.protected voidsetOut(DataOutputStream out) Setter foroutfield.protected voidsetTdsVersion(int tdsVersion) Set the TDS version field.protected voidsetTimeout(int timeout) Set the socket timeout.
-
Field Details
-
socket
The shared network socket. -
sslSocket
The shared SSL network socket; -
out
Output stream for network socket. -
in
Input stream for network socket. -
maxBufSize
private int maxBufSizeCurrent maximum input buffer size. -
_LastID
last ID assigned to a VirtualSocket instance -
_VirtualSockets
Table of stream objects sharing this socket. -
responseOwner
The virtual socket of the object that is expecting a response from the server. -
hdrBuf
private final byte[] hdrBufBuffer for packet header. -
bufferDir
The directory to buffer data to. -
globalMemUsage
private static int globalMemUsageTotal memory usage in all instances of the driver NB. Access to this field should probably be synchronized but in practice lost updates will not matter much and I think all VMs tend to do atomic saves to integer variables. -
peakMemUsage
private static int peakMemUsagePeak memory usage for debug purposes. -
memoryBudget
private static int memoryBudgetMax memory limit to use for buffers. Only when this limit is exceeded will the driver start caching to disk. -
minMemPkts
private static int minMemPktsMinimum number of packets that will be cached in memory before the driver tries to write to disk even if memoryBudget has been exceeded. -
securityViolation
private static boolean securityViolationGlobal flag to indicate that security constraints mean that attempts to create work files will fail. -
tdsVersion
private int tdsVersionTds protocol version -
serverType
protected final int serverTypeThe servertype one of Driver.SQLSERVER or Driver.SYBASE -
charsetInfo
The character set to use for converting strings to/from bytes. -
packetCount
private int packetCountCount of packets received. -
host
The server host name. -
port
private int portThe server port number. -
cancelPending
private boolean cancelPendingA cancel packet is pending. -
cancelMonitor
Synchronization monitor forcancelPendingandresponseOwner. -
doneBuffer
private final byte[] doneBufferBuffer for TDS_DONE packets -
doneBufferFrag
private int doneBufferFragHow much of the doneBuffer has been filled with data, invalid input: '<'TDS_DONE_LEN IFF partial packet read. -
TDS_DONE_TOKEN
private static final int TDS_DONE_TOKENTDS done token.- See Also:
-
TDS_DONE_LEN
private static final int TDS_DONE_LENLength of a TDS_DONE token.- See Also:
-
TDS_HDR_LEN
private static final int TDS_HDR_LENLength of TDS packet header.- See Also:
-
-
Constructor Details
-
SharedSocket
-
SharedSocket
SharedSocket(JtdsConnection connection) throws IOException, UnknownHostException Construct aSharedSocketobject specifying host name and port.- Parameters:
connection- the connection object- Throws:
IOException- if socket open failsUnknownHostException
-
-
Method Details
-
createSocketForJDBC3
Creates aSocketconnection.- Parameters:
connection- the connection object- Returns:
- a socket open to the host and port with the given timeout
- Throws:
IOException- if socket open fails
-
getMAC
String getMAC() -
enableEncryption
Enable TLS encryption by creating a TLS socket over the existing TCP/IP network socket.- Parameters:
ssl- the SSL URL property value- Throws:
IOException- if an I/O error occurs
-
disableEncryption
Disable TLS encryption and switch back to raw TCP/IP socket.- Throws:
IOException- if an I/O error occurs
-
setCharsetInfo
Set the character set descriptor to be used to translate byte arrays to or from Strings.- Parameters:
charsetInfo- the character set descriptor
-
getCharsetInfo
CharsetInfo getCharsetInfo()Retrieve the character set descriptor used to translate byte arrays to or from Strings. -
getCharset
String getCharset()Retrieve the character set name used to translate byte arrays to or from Strings.- Returns:
- the character set name as a
String
-
getRequestStream
Obtain an instance of a server request stream for this socket.- Parameters:
bufferSize- the initial buffer size to be used by theRequestStreammaxPrecision- the maximum precision for numeric/decimal types- Returns:
- the server request stream as a
RequestStream
-
getResponseStream
Obtain an instance of a server response stream for this socket. NB. getRequestStream() must be used first to obtain the RequestStream needed as a parameter for this method.- Parameters:
requestStream- an existing server request stream object obtained from thisSharedSocketbufferSize- the initial buffer size to be used by theRequestStream- Returns:
- the server response stream as a
ResponseStream
-
getTdsVersion
int getTdsVersion()Retrieve the TDS version that is active on the connection supported by this socket.- Returns:
- the TDS version as an
int
-
setTdsVersion
protected void setTdsVersion(int tdsVersion) Set the TDS version field.- Parameters:
tdsVersion- the TDS version as anint
-
setMemoryBudget
static void setMemoryBudget(int memoryBudget) Set the global buffer memory limit for all instances of this driver.- Parameters:
memoryBudget- the global memory budget
-
getMemoryBudget
static int getMemoryBudget()Get the global buffer memory limit for all instancs of this driver.- Returns:
- the memory limit as an
int
-
setMinMemPkts
static void setMinMemPkts(int minMemPkts) Set the minimum number of packets to cache in memory before writing to disk.- Parameters:
minMemPkts- the minimum number of packets to cache
-
getMinMemPkts
static int getMinMemPkts()Get the minimum number of memory cached packets.- Returns:
- minimum memory packets as an
int
-
isConnected
boolean isConnected()Get the connected status of this socket.- Returns:
trueif the underlying socket is connected
-
close
Close the socket and release all resources.- Throws:
IOException- if the socket close fails
-
forceClose
void forceClose()Force close the socket causing any pending reads/writes to fail.Used by the login timer to abort a login attempt.
-
readPacket
Read a physical TDS packet from the network.- Parameters:
buffer- a buffer to read the data into (if it fits) or null- Returns:
- either the incoming buffer if it was large enough or a newly allocated buffer with the read packet
- Throws:
IOException
-
getPktLen
static int getPktLen(byte[] buf) Convert two bytes (in network byte order) in a byte array into a Java short integer.- Parameters:
buf- array of data- Returns:
- the 16 bit unsigned value as an
int
-
setTimeout
Set the socket timeout.- Parameters:
timeout- the timeout value in milliseconds- Throws:
SocketException
-
setKeepAlive
Set the socket keep alive.- Parameters:
keepAlive-trueto turn on socket keep alive- Throws:
SocketException
-
getIn
Getter forinfield.- Returns:
InputStreamused for communication
-
setIn
Setter forinfield.- Parameters:
in- theInputStreamto be used for communication
-
getOut
Getter foroutfield.- Returns:
OutputStreamused for communication
-
setOut
Setter foroutfield.- Parameters:
out- theOutputStreamto be used for communication
-
getHost
Get the server host name.- Returns:
- the host name as a
String
-
getPort
protected int getPort()Get the server port number.- Returns:
- the host port as an
int
-
finalize
Ensure all resources are released.
-