Tomcat по сравнению с поиском Weblogic JNDI

Существует много форматов, которые можно использовать для сериализации объектов Python в байты. Есть плюсы и минусы для каждого из них.

Если у данных есть только список кортежей целых и дробных чисел, это делает работу довольно простой.

Предположим, это данные:

data = 100 * [(1, 1.111), (18, 1.234), (555555, 0.001), (-1, 1e70)]

Какие из них попадают в категорию «струн», мне не ясно. Наиболее очевидный формат "строки" будет str(data). Насколько он велик?

>>> len(str(data))
5500

Это занимает 5500 байт. Вопрос требует чего-то более сжатого. Итак, мы ищем что-то намного короче, чем 5500 байт.

JSON - очень популярный формат (это также строка). Насколько он велик?

>>> len(json.dumps(data))
5500

Он имеет такой же размер (5500 байт), но, по крайней мере, он четко определен. Это может быть меньше? Как насчет BZipped JSON ?

>>> len(bz2.compress(json.dumps(data).encode('utf-8')))
131

Это намного лучше!

Это, вероятно, было очень хорошо из-за повторяющегося паттерна. Есть ли формат, в котором не используется архивирование? Может быть, рассол ?

>>> len(pickle.dumps(data))
862

Не так хорошо, как почтовый индекс (конечно!), Но все же хорошо.

Можем ли мы сделать рассол BZipped ?

>>> len(bz2.compress(pickle.dumps(data)))
155

Лучше, но нет никаких причин, чтобы он был лучше, чем BZipped JSON.

Как насчет другого формата? Вы можете преобразовать каждый кортеж в эквивалент этой структуры C , используя модуль struct :

struct {
    int i;
    double f;
};

Однако, тогда вы должны будете знать, насколько большой INT может быть. Python int может быть настолько большим, насколько вы хотите, но если вы, например, Знайте, что все числа находятся в диапазоне от 0 до 255, вам просто нужен один байт. Для float вам нужно 64 бита (то есть 8 байт), иначе вы потеряете точность. Таким образом, это увеличится до 1000 байтов. Не очень хорошо.

Есть также другие встроенные опции, описанные в документации Python по сохранению .

Вы также можете придумать свой собственный формат.

В конце концов, вы должны решить, что подходит вам больше всего.

25
задан Luther Baker 6 September 2008 в 17:13
поделиться

7 ответов

JndiLocatorSupport имеет свойство resourceRef. При установке этого верного, "java:comp/env /" префикс будет предварительно ожидаться автоматически. Таким образом, я полагаю, что это было бы корректно для дифференциации этого параметра при перемещении от Tomcat до Weblogic.

11
ответ дан 28 November 2019 в 21:26
поделиться

Как использовать одно имя JNDI в вашем веб-приложении

Я сам боролся с этим несколько месяцев. Лучшее решение - сделать ваше приложение переносимым, чтобы у вас было одинаковое имя JNDI как в Tomcat, так и в Weblogic.

Чтобы сделать это, вы измените web.xml и spring-beans.xml так, чтобы они указывали на одно имя jndi, и предоставили сопоставление каждому jndi-имени конкретного поставщика.

Я разместил каждый файл ниже.

Вам необходимо:

  • Запись <resource-ref /> в web.xml для вашего приложения, чтобы использовать одно имя
  • Файл WEB-INF/weblogic.xml для сопоставления вашего имени jndi с ресурс, управляемый WebLogic
  • Файл META-INF/context.xml для сопоставления вашего имени jndi с ресурсом, управляемым Tomcat
    • Это может быть либо в установке Tomcat, либо в вашем приложении.

Как правило, предпочитайте, чтобы ваши имена jndi были в вашем приложении, такие как jdbc/MyDataSource и jms/ConnFactory, и избегайте их префикса с java:comp/env/.

Кроме того, источники данных и фабрики соединений лучше всего управляются контейнером и используются с JNDI. Это распространенная ошибка - создавать экземпляры пулов соединений с базой данных в вашем приложении .

весна

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd">

<jee:jndi-lookup jndi-name="jdbc/appds"
                 id="dataSource" />
</beans>

web.xml

<resource-ref>
    <description>My data source</description>
    <res-ref-name>jdbc/appds</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

weblogic.xml

<?xml version="1.0" encoding="UTF-8" ?>
<weblogic-web-app
    xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
        http://xmlns.oracle.com/weblogic/weblogic-web-app http://http://www.oracle.com/technology/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">

<resource-description>
    <jndi-name>appds</jndi-name>
    <res-ref-name>jdbc/appds</res-ref-name>
</resource-description>
</weblogic-web-app>

META-INF / context.xml (для Tomcat)

<Context>
    <ResourceLink global="jdbc/appds" name="jdbc/appds" type="javax.sql.DataSource"/>
</Context>
19
ответ дан 28 November 2019 в 21:26
поделиться

Следующий конфиг работает в Tomcat и Weblogic для меня.

Весной:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
   <!-- This will prepend 'java:comp/env/' for Tomcat, but still fall back to the short name for Weblogic -->
   <property name="resourceRef" value="true" /> 
   <property name="jndiName" value="jdbc/AgriShare" />
</bean>

В Weblogic Admin Console создайте ресурс JDBC с именем jdbc/AgriShare. В разделе «Цели» УБЕДИТЕСЬ, ЧТО ВЫ ПРЕДНАЗНАЧАЕТЕ ДАННЫЕ НА СЕРВЕР, НА КОТОРЫЙ ВЫ РАЗРАБОТАЕТЕ СВОЕ ПРИЛОЖЕНИЕ! . Этот конкретный момент стоил мне времени только сейчас ...

2
ответ дан 28 November 2019 в 21:26
поделиться

Как насчет evironment переменной? Машины разработчиков набора с именем кота и производство с названием Weblogic. Можно даже установить код для использования по умолчанию (WebLogic) в случае, если переменная не существует.

1
ответ дан 28 November 2019 в 21:26
поделиться

Как вы ссылаетесь на ресурс весной?

Это то, что мы имеем для tomcat:

контекст:

<Resource name="jms/ConnectionFactory" auth="Container" type="org.apache.activemq.ActiveMQConnectionFactory" description="
JMS Connection Factory"
        factory="org.apache.activemq.jndi.JNDIReferenceFactory" brokerURL="tcp://localhost:61615" brokerName="StandaloneAc
tiveMQBroker"/>

весна:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd
http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">

<jee:jndi-lookup jndi-name="jms/ConnectionFactory" id="connectionFactory" resource-ref="true"
                         expected-type="javax.jms.ConnectionFactory" lookup-on-startup="false"/>

Пространство имен Джи происходит из:

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd

1
ответ дан 28 November 2019 в 21:26
поделиться

В моем приложении также была похожая проблема, и я решил ее следующим образом:

1) WEB-INF/classes/application.properties содержит запись:

ds.jndi=java:comp/env/jdbc/tcds

2) На машине WLS я есть запись в файле /etc/sysenv:

ds.jndi=wlsds

3) Я настроил пружину для поиска JNDI по свойству ${ds.jndi}, используя bean-компонент PropertyPlaceholderConfigurer с classpath:application.properties и file:/etc/sysenv как местах. Я также установил ignoreResourceNotFound в true, чтобы разработчикам не нужно было /etc/sysenv на своих машинах.

4) Я запустил интеграционный тест с использованием Cargo + Jetty и не смог правильно настроить среду JNDI. Итак, у меня есть запасной вариант BasicDataSource, настроенный тоже с использованием свойства defaultObject из JndiObjectFactoryBean.

0
ответ дан 28 November 2019 в 21:26
поделиться

Мне удалось уловить трюк с Tomcat и WebLogic с помощью Spring. Вот описание того, как это работало для меня.

2
ответ дан 28 November 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: