我在我的应用程序中使用 EclipseLink。EclipseLink 使用一些连接池。我使用 EclipseLink 内部的。连接池在需要时创建连接,然后保留以供将来使用。
我需要在创建每个连接时对它进行一次特定的 SQL 调用,但只需要一次。我需要做的是在 oracle 上授予用户特定角色。为了安全起见,此用户具有此角色,但已禁用,需要启用它。
我不想每次从池中获取连接时都这样做,只有在创建它时才这样做。
我该怎么做?
我在我的应用程序中使用 EclipseLink。EclipseLink 使用一些连接池。我使用 EclipseLink 内部的。连接池在需要时创建连接,然后保留以供将来使用。
我需要在创建每个连接时对它进行一次特定的 SQL 调用,但只需要一次。我需要做的是在 oracle 上授予用户特定角色。为了安全起见,此用户具有此角色,但已禁用,需要启用它。
我不想每次从池中获取连接时都这样做,只有在创建它时才这样做。
我该怎么做?
EclipseLink 不能开箱即用地做到这一点。org.eclipse.persistence.sessions.server.ConnectionPool
您必须创建一个扩展并覆盖该方法的新类buildConnection()
。创建新连接时将调用此方法。
我找到了更好的解决方案。我会把它放在这里,以防将来有人寻找它。
我使用自己的 SessionCustomizer。其中我有:
public void customize(Session session) throws Exception {
DatabaseLogin login = session.getLogin();
Connector connector = login.getConnector();
login.setConnector(new ConnectorWrapper(connector, m_onCreationQuery));
}
所以有我自己的ConnectorWrapper,它反过来包装原始连接器,在创建连接时,使用原始连接器创建它,然后对其调用SQL查询,然后返回它。
首先:创建连接需要做什么?我问是因为您的问题可能有特定的解决方案。
至于如何做到这一点,这完全取决于您使用的连接池以及您如何设置它。某些连接池将允许您提供或定义用于创建新连接的连接工厂。在这种情况下,您可以根据需要初始化它们,如果可能的话,这就是我建议的方法。
但是,如果没有有关您的设置的更多详细信息,很难进一步回答。