[ 
https://issues.apache.org/jira/browse/TINKERPOP-3213?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18035185#comment-18035185
 ] 

ASF GitHub Bot commented on TINKERPOP-3213:
-------------------------------------------

kenhuuu commented on code in PR #3258:
URL: https://github.com/apache/tinkerpop/pull/3258#discussion_r2488162759


##########
gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java:
##########
@@ -773,6 +773,80 @@ public Client alias(final Map<String, String> aliases) {
         }
     }
 
+    /**
+     * A {@code Client} implementation that operates in the context of a 
session. {@code ChildSessionClient} is tied to
+     * another client as a child, it borrows the connection from the parent 
client's pool for the transaction. Requests are
+     * sent to a single server, where each request is bound to the same thread 
and same connection with the same set of
+     * bindings across requests.
+     * Transaction are not automatically committed. It is up the client to 
issue commit/rollback commands.
+     */
+    public final static class SessionedChildClient extends Client {
+        private final String sessionId;
+        private final boolean manageTransactions;
+        private final boolean maintainStateAfterException;
+        private final Client parentClient;
+        private Connection borrowedConnection;
+        private boolean closed;
+
+        public SessionedChildClient(final Client parentClient, String 
sessionId) {
+            super(parentClient.cluster, parentClient.settings);
+            this.parentClient = parentClient;

Review Comment:
   Does it make sense for any type of Client to be the parent? SessionedClient 
only allows for one connection so maybe there should be a check here that 
disallows that particular client?



##########
gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java:
##########
@@ -773,6 +773,80 @@ public Client alias(final Map<String, String> aliases) {
         }
     }
 
+    /**
+     * A {@code Client} implementation that operates in the context of a 
session. {@code ChildSessionClient} is tied to
+     * another client as a child, it borrows the connection from the parent 
client's pool for the transaction. Requests are
+     * sent to a single server, where each request is bound to the same thread 
and same connection with the same set of
+     * bindings across requests.
+     * Transaction are not automatically committed. It is up the client to 
issue commit/rollback commands.
+     */
+    public final static class SessionedChildClient extends Client {

Review Comment:
   It would have been best if there was a solution that kept this class 
package-private, as it now differs from the other Clients that are only 
supposed to be exposed via Cluster. It's fine for this PR, but I'd probably 
recommend adding a Jira to look into this again in the future after this is 
merged.



##########
gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Client.java:
##########
@@ -773,6 +773,80 @@ public Client alias(final Map<String, String> aliases) {
         }
     }
 
+    /**
+     * A {@code Client} implementation that operates in the context of a 
session. {@code ChildSessionClient} is tied to
+     * another client as a child, it borrows the connection from the parent 
client's pool for the transaction. Requests are
+     * sent to a single server, where each request is bound to the same thread 
and same connection with the same set of
+     * bindings across requests.
+     * Transaction are not automatically committed. It is up the client to 
issue commit/rollback commands.
+     */
+    public final static class SessionedChildClient extends Client {
+        private final String sessionId;
+        private final boolean manageTransactions;
+        private final boolean maintainStateAfterException;
+        private final Client parentClient;
+        private Connection borrowedConnection;
+        private boolean closed;
+
+        public SessionedChildClient(final Client parentClient, String 
sessionId) {
+            super(parentClient.cluster, parentClient.settings);
+            this.parentClient = parentClient;
+            this.sessionId = sessionId;
+            this.closed = false;
+            this.manageTransactions = parentClient.settings.getSession().map(s 
-> s.manageTransactions).orElse(false);
+            this.maintainStateAfterException = 
parentClient.settings.getSession().map(s -> 
s.maintainStateAfterException).orElse(false);
+        }
+
+        public String getSessionId() {

Review Comment:
   This method is currently unused which may be a potential problem. There is 
specialized handling for sessions at 
https://github.com/apache/tinkerpop/blob/3.7-dev/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/Connection.java#L313
 as well as 
https://github.com/apache/tinkerpop/blob/3.7-dev/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/remote/DriverRemoteConnection.java#L235





> Re-use connections for sessions
> -------------------------------
>
>                 Key: TINKERPOP-3213
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-3213
>             Project: TinkerPop
>          Issue Type: Improvement
>          Components: driver
>    Affects Versions: 3.7.4
>            Reporter: Ken Hu
>            Priority: Major
>             Fix For: 3.8.0, 3.7.5
>
>
> The Java driver creates a new client for each session. These sessions are 
> used for transactions as well. In situations where there are lots of 
> transactions being used, the driver will open and close connections per 
> transaction. It would be best if this overhead was reduced by reusing exising 
> connections.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to