Разница между страницами «Партиционирование» и «Pro Spring 4»

Материал из Home Wiki
(Различия между страницами)
Перейти к навигации Перейти к поиску
м
 
 
Строка 1: Строка 1:
=== Функции ===
= Конфигурация XML =
<syntaxhighlight lang="plsql">
== context:component-scan ==
CREATE OR REPLACE FUNCTION move_data_month(dd timestamp without time zone)
Дескриптор <context:component-scan> сообщает Spring о необходимости
сканирования кода на предмет внедряемых бинов, аннотированных с помощью
@Component, @Controller, @Repository и @Service, а также поддерживающих
аннотации @Autowired и @Inject в указанном пакете (и всех eгo внутренних па­
кетах). В дескрипторе <context:component-scan> можно определить множест­во
пакетов, используя в качестве разделителя запятую, точку запятой или пробел.
Кроме того, для более детализированного управления этот дескриптор поддержи­вает
включение и исключение сканирования компонентов.
Также можно указать пакет для сканирования через установку атрибута base-package.
Еще можно указать исключения через context:exclude-filter.


  RETURNS text AS
== bean ==
=== bean/property ===
name - Имя свойства бина
value - значение (простой тип)


$BODY$
До версии 2.5:
ref - ссылка на другой бин по id
Применение атрибута local означает, что дескриптор ref всегда просматривает только иден­тификатор бина и никогда не принимает во внимание его псевдонимы:
<nowiki><ref local="test"/></nowiki>
Более того, определение бина должно существовать в том же самом ХМL-файле конфигурации.


DECLARE
Пример ссылки на бин (ссылка текущий, дочерний, родительский контекст)
<nowiki><ref bean="newBean"/></nowiki>
Пример ссылки на бин родительского контекста
<nowiki><ref parent="newBean"/></nowiki>
С версии 2.5: конфигурировать можно не через property, а в самом bean так:
p:<тут имя свойства>-ref="id другого бина"
или так
p:<тут имя свойства>="простое значение"
Через SpEL:
p:name = "#{injectSimpleConfig.name}"


     dd ALIAS FOR $1;
==== bean/property/map ====
Пример:
<nowiki><property name="map">
  <map>
    <entry key="v1">
      <value>Hello World!</value>
    </entry>
    <entry key="refToBean">
      <ref local="localBeanId"/>
    </entry>
  </map>
</property></nowiki>


     dname text;
==== bean/property/set ====


     dname1 text;
<nowiki><property name="set">
  <set>
    <value>Hello World 1 </value>
    <ref local="oracle" />
  </set>
</property></nowiki>


     rn text;
==== bean/property/list ====


BEGIN
<nowiki><property name="list">
  <list>
    <value>Hello World!</value>
    <ref local="localBeanId"/>
  </list>
</property></nowiki>


    select into dname1 extract(month from ($1-interval '1 month'));
=== bean/property/props ===
Дескриптор <props> позво­ляет передавать в качестве значений только String,
потому что класс Properties разрешает только значения свойств типа String.
Пример:
<property name="props">
  <props>
    <prop key="firstName">Sasha</prop>
  <prop key="secondName">V.</prop>
  </props>
</property>


    if char_length(dname1) = 1 then
=== bean/constructor-arg ===
До версии 3.1:
constructor-arg определяет Constructor Injection.
Всегда лучше применять атрибут index, чтобы избежать путаницы между параметрами.


        select into dname1 '0' || extract(month from ($1-interval '1 month'));
С версии 3.1: можно применять в bean выражение вида c:<свойство>=<значение>
или _<digit> - как указание индекса аргумента конструктора
<bean id="message" class="java.lang.String" с:_O="message"/>


    end if;
Если есть 2 конструктора с одинаковыми именами параметров, то можно указать тип
<constructor-arg type="int"><value>1</value><constructor-arg>


    DROP TABLE IF EXISTS  payments_log_move;
=== bean/lookup-method ===
Пример Method Injection:
<nowiki> <bean id="abstractLookupBean" class="com.a.AЬstractLookupDemoBean">
  <lookup-method name="getMyHelper" bean="helper"/>
</bean></nowiki>


    CREATE TABLE payments_log_move ( ) INHERITS (payments_log);
= util =
Пространство имен util, пре­доставляемое Spring, для объявления бинов, хранящих свойства коллекций.
== util:map ==
<nowiki> <util:map id="map" map-class = "java.util.HashMap">
  <entry key = "someValue">
    <value>Hello World!</value>
  </entry>
  <entry key="someBean">
    <ref bean="beanId"/>
  </entry>
</util:map></nowiki>


    ALTER TABLE payments_log_move NO INHERIT payments_log;
== util:properties ==
<nowiki> <util:properties id="props">
  <prop key="firstName">Sasha</prop>
  <prop key = "secondName">V.</prop>
</util:properties></nowiki>


    INSERT INTO payments_log_move select * from payments_log where "time" >= $1 - interval '1 month' AND "time" < $1;
== util:set ==
<nowiki> <util: set id="set">
  <value>Hello World!</value>
  <ref bean = "oracle"/>
</util: set></nowiki>


    DELETE FROM payments_log WHERE "time" >= $1 - interval '1 month' AND "time" < $1;
== util:list ==
<nowiki> <util:list id="list">
  <value>Hello World!</value>
  <ref bean="oracle"/>
</util:list></nowiki>


    SELECT INTO dname 'payments_log_y' || extract(year from ($1-interval '1 month')) || 'm' || dname1;
= Кофигурация аннотациями =
== @Autowired ==
Если указано на setter, то происходит автоматическое связывание.


    
Если указано на construcor, то происходит автоматическая передача параметра, пример:
@Autowired
public NewConstructor (@Value ( "message") String message) {
    this.message = message;
}
Аннотация @Autowired может быть применена только к одному из мето­дов конструкторов.


    SELECT INTO rn (SELECT count(relname) FROM pg_class WHERE relname = dname);
== @Inject ==
В спринг аналогична автоматическому связыванию (JSR-299).


    if rn = '0' THEN
== @Resource ==
Пример - @Resource (name = "messageProvider") указывается для поддержки автоматического связывания. (JSR-250)


        EXECUTE 'CREATE TABLE ' || dname || '( ) INHERITS (payments_log)';
== @Value ==
Предназначена для определения зна­чения, подлежащего внедрению.
Свойства:
@Value("32")
private int age;
Через SpEL:
@Value("#{injectSimpleConfig.name}")


    end if;


    EXECUTE 'INSERT INTO ' || dname || ' select * from payments_log_move';
Жесткое кодирование значения не является удачной идеей, т.к. его изме­нение влечет за собой перекомпиляцию программы.


    return 'OK ' || dd || ' <> ' ||dname;
== @Service ==
Пример - @Service("messageRenderer") указывает, что этот бин предоставляет службы,
которые могут требоваться другим бинам; в качестве параметра аннотации передается имя бина.


END;
== @Component ==
 
@Component("injectSimpleConfig")
$BODY$
@Service является специализацией @Component, отражающей тот факт, что аннотированный класс предоставляет бизнес-службу другим уровням внутри приложения.
 
= Классы Spring =
  LANGUAGE plpgsql
== StopWatch ==
 
org.springframework.util.StopWatch - этот класс очень полезный в ситуациях, когда необходимо проводить простые оценки производительности и тестировать разрабатываемые приложения.
;
StopWatch stopWatch = new StopWatch();
</syntaxhighlight>
stopWatch.start("demo");
 
for (int х = О; х < 100000; х++) {
select move_data_month('2016-01-01'::timestamp);
  MyHelper helper = bean.getMyHelper();
 
  helper.doSomethingHelpful();
select * from payments_log_y2013m04;
}
 
stopWatch.stop();
<syntaxhighlight lang="plsql">
CREATE OR REPLACE FUNCTION move_data_year(dd timestamp without time zone)
 
  RETURNS text AS
 
$BODY$
 
DECLARE
 
     dd ALIAS FOR $1;
 
     dname text;
 
     dname1 text;
 
     rn text;
 
BEGIN
 
    DROP TABLE IF EXISTS  payments_log_move;
 
    CREATE TABLE payments_log_move ( ) INHERITS (payments_log);
 
    ALTER TABLE payments_log_move NO INHERIT payments_log;
 
    INSERT INTO payments_log_move select * from payments_log where "time" >= $1 - interval '1 year' AND "time" < $1;
 
    DELETE FROM payments_log WHERE "time" >= $1 - interval '1 year' AND "time" < $1;
 
    SELECT INTO dname 'payments_log_y' || extract(year from ($1-interval '1 year'));
 
    SELECT INTO rn (SELECT count(relname) FROM pg_class WHERE relname = dname);
 
    if rn = '0' THEN
 
        EXECUTE 'CREATE TABLE ' || dname || '( ) INHERITS (payments_log)';
 
    end if;
 
    EXECUTE 'INSERT INTO ' || dname || ' select * from payments_log_move';
 
    return 'OK ' || dd || ' <> ' ||dname;
 
END;
 
$BODY$
 
  LANGUAGE plpgsql
 
;
</syntaxhighlight>
 
<syntaxhighlight lang="plsql">
CREATE OR REPLACE FUNCTION index_part_data(year character varying)
 
  RETURNS text AS
 
$BODY$
 
DECLARE
 
     year ALIAS FOR $1;
 
     dname text;
 
     rn text;
 
BEGIN
 
    SELECT INTO dname 'payments_log_y' || year;
 
    SELECT INTO rn (SELECT count(relname) FROM pg_class WHERE relname = dname);
 
    if rn = '0' THEN
 
        return 'NO SUCH TABLE ' || dname;
 
    end if;
 
    EXECUTE 'CREATE INDEX pl' || year || '_idx_identifier_id_service ON payments_log_y' || year ||
 
        ' USING btree (identifier COLLATE pg_catalog."default", id_service)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_idx_pl_external_time ON payments_log_y' || year ||
 
        ' USING btree (external_time)';
 
    EXECUTE 'CREATE UNIQUE INDEX pl' || year || '_id_apparat_id_trans_idx ON payments_log_y' || year ||
 
        ' USING btree (id_apparat, id_trans)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_id_apparat_idx ON payments_log_y' || year ||
 
        ' USING btree (id_apparat)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_id_region_idx ON payments_log_y' || year ||
 
        ' USING btree (id_region)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_id_service_idx ON payments_log_y' || year ||
 
        ' USING btree (id_service)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_identifier_idx ON payments_log_y' || year ||
 
        ' USING btree (identifier COLLATE pg_catalog."default")';
 
    EXECUTE 'CREATE INDEX pl' || year || '_time_app_idx ON payments_log_y' || year ||
 
        ' USING btree (time_app)';
 
    EXECUTE 'CREATE INDEX pl' || year || '_time_idx ON payments_log_y' || year ||
 
        ' USING btree ("time")';
 
    EXECUTE 'CREATE INDEX pl' || year || '_time_proc_idx ON payments_log_y' || year ||
 
        ' USING btree (time_proc)';
 
    EXECUTE 'CREATE UNIQUE INDEX payments_log_y' || year || '_id_idx ON payments_log_y' || year ||
 
        ' USING btree (id)';
 
    return 'DONE INDEXES ON ' || dname;
 
END;
 
$BODY$
 
  LANGUAGE plpgsql
 
;
</syntaxhighlight>
 
select index_part_data('2010');
 
=== Анализ запросов ===
1. в базе
 
create extension pg_stat_statements;
 
2. в конфиге
 
<syntaxhighlight lang="text">
shared_preload_libraries = 'pg_stat_statements'
 
pg_stat_statements.max = 1000
 
pg_stat_statements.track = all
</syntaxhighlight>
 
<syntaxhighlight lang="sql">
select total_time/calls as AVG_COST,* from pg_stat_statements where total_time/calls > 10 and calls > 10 order by AVG_COST desc;
</syntaxhighlight>
 
=== Оптимизация ===
<syntaxhighlight lang="sql">
CREATE INDEX idx_events_class_date
 
ON events
 
USING btree
 
(id_class_events, date);
</syntaxhighlight>
 
ip-appcheck
<syntaxhighlight lang="sql">
CREATE INDEX idx_events_ip_appcheck707 ON events USING btree (id_apparat, id_class_events) WHERE id_class_events=707;
 
CREATE INDEX idx_events_ip_appcheck708 ON events USING btree (id_apparat, id_class_events) WHERE id_class_events=708;
</syntaxhighlight>
 
[[Категория:Работа]]

Версия 09:50, 11 февраля 2017

Конфигурация XML

context:component-scan

Дескриптор <context:component-scan> сообщает Spring о необходимости сканирования кода на предмет внедряемых бинов, аннотированных с помощью @Component, @Controller, @Repository и @Service, а также поддерживающих аннотации @Autowired и @Inject в указанном пакете (и всех eгo внутренних па­ кетах). В дескрипторе <context:component-scan> можно определить множест­во пакетов, используя в качестве разделителя запятую, точку запятой или пробел. Кроме того, для более детализированного управления этот дескриптор поддержи­вает включение и исключение сканирования компонентов. Также можно указать пакет для сканирования через установку атрибута base-package. Еще можно указать исключения через context:exclude-filter.

bean

bean/property

name - Имя свойства бина value - значение (простой тип)

До версии 2.5:

ref - ссылка на другой бин по id

Применение атрибута local означает, что дескриптор ref всегда просматривает только иден­тификатор бина и никогда не принимает во внимание его псевдонимы:

<ref local="test"/>

Более того, определение бина должно существовать в том же самом ХМL-файле конфигурации.

Пример ссылки на бин (ссылка текущий, дочерний, родительский контекст)

<ref bean="newBean"/>

Пример ссылки на бин родительского контекста

<ref parent="newBean"/>

С версии 2.5: конфигурировать можно не через property, а в самом bean так:

p:<тут имя свойства>-ref="id другого бина"

или так

p:<тут имя свойства>="простое значение"

Через SpEL:

p:name = "#{injectSimpleConfig.name}"

bean/property/map

Пример:

<property name="map">
   <map>
     <entry key="v1">
       <value>Hello World!</value>
     </entry>
     <entry key="refToBean">
       <ref local="localBeanId"/>
     </entry>
   </map>
 </property>

bean/property/set

<property name="set">
   <set>
     <value>Hello World 1 </value>
     <ref local="oracle" />
   </set>
 </property>

bean/property/list

<property name="list">
   <list>
     <value>Hello World!</value>
     <ref local="localBeanId"/>
   </list>
 </property>

bean/property/props

Дескриптор <props> позво­ляет передавать в качестве значений только String, потому что класс Properties разрешает только значения свойств типа String. Пример:

<property name="props">
  <props>
    <prop key="firstName">Sasha</prop>
  <prop key="secondName">V.</prop>
  </props>
</property>

bean/constructor-arg

До версии 3.1: constructor-arg определяет Constructor Injection. Всегда лучше применять атрибут index, чтобы избежать путаницы между параметрами.

С версии 3.1: можно применять в bean выражение вида c:<свойство>=<значение> или _<digit> - как указание индекса аргумента конструктора

<bean id="message" class="java.lang.String" с:_O="message"/>

Если есть 2 конструктора с одинаковыми именами параметров, то можно указать тип

<constructor-arg type="int"><value>1</value><constructor-arg>

bean/lookup-method

Пример Method Injection:

 <bean id="abstractLookupBean" class="com.a.AЬstractLookupDemoBean">
   <lookup-method name="getMyHelper" bean="helper"/>
 </bean>

util

Пространство имен util, пре­доставляемое Spring, для объявления бинов, хранящих свойства коллекций.

util:map

 <util:map id="map" map-class = "java.util.HashMap">
   <entry key = "someValue">
     <value>Hello World!</value>
   </entry>
   <entry key="someBean">
     <ref bean="beanId"/>
   </entry>
 </util:map>

util:properties

 <util:properties id="props">
   <prop key="firstName">Sasha</prop>
   <prop key = "secondName">V.</prop>
 </util:properties>

util:set

 <util: set id="set">
   <value>Hello World!</value>
   <ref bean = "oracle"/>
 </util: set>

util:list

 <util:list id="list">
   <value>Hello World!</value>
   <ref bean="oracle"/>
 </util:list>

Кофигурация аннотациями

@Autowired

Если указано на setter, то происходит автоматическое связывание.

Если указано на construcor, то происходит автоматическая передача параметра, пример:

@Autowired
public NewConstructor (@Value ( "message") String message) {
    this.message = message;
}

Аннотация @Autowired может быть применена только к одному из мето­дов конструкторов.

@Inject

В спринг аналогична автоматическому связыванию (JSR-299).

@Resource

Пример - @Resource (name = "messageProvider") указывается для поддержки автоматического связывания. (JSR-250)

@Value

Предназначена для определения зна­чения, подлежащего внедрению. Свойства:

@Value("32")
private int age;

Через SpEL:

@Value("#{injectSimpleConfig.name}")


Жесткое кодирование значения не является удачной идеей, т.к. его изме­нение влечет за собой перекомпиляцию программы.

@Service

Пример - @Service("messageRenderer") указывает, что этот бин предоставляет службы, которые могут требоваться другим бинам; в качестве параметра аннотации передается имя бина.

@Component

@Component("injectSimpleConfig") @Service является специализацией @Component, отражающей тот факт, что аннотированный класс предоставляет бизнес-службу другим уровням внутри приложения.

Классы Spring

StopWatch

org.springframework.util.StopWatch - этот класс очень полезный в ситуациях, когда необходимо проводить простые оценки производительности и тестировать разрабатываемые приложения.

StopWatch stopWatch = new StopWatch();
stopWatch.start("demo");
for (int х = О; х < 100000; х++) {
  MyHelper helper = bean.getMyHelper();
  helper.doSomethingHelpful();
}
stopWatch.stop();